笔前闲聊
最近都在写一些防守型文章,是因为笔者在最近的学习当中发现一些当初以攻击者角度学习的知识在某些特殊的场合下会表现的有点不够全面,总是感觉某些知识点联系不在一起,所以最近总是写一些防御型文章来把一些知识加强理解,在脑子里形成自己的知识脑图。
认识xss
首先还是来了解什么是xss,师傅们对这个东西估计也挺熟的啦,我就直接上百度了。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
xss的分类
xss的分类有,反射型、存储型、DOM型。具体就不做解释,师傅们应该也都懂,不懂的师傅百度上也很容易查到。
xss能够构成的危害
关于xss能够造成的危害师傅们可能最了解的就是弹窗、盗取cookie,而其实呢,xss能够造成的危害远不止这些,还有一些如网站挂马、蠕虫、修改网页内容的高级利用,那么我们该如何去防御xss从而去杜绝这些利用呢?
xss的防御
方案一:添加HttpOnly
HttpOnly是cookie里面一个属性,假如在cookie里面设置了HttpOnly这个属性,那么JavaScript将无法访问到我们到cookie,但是这个方法也只能是防御cookie劫持。HttpOnly设置规则如下。
<?php
header("set-cookie: username=admin");
header("set-cookie: password=123456;httponly",false);
?>
方案二:对输入输出做严格的过滤
输入输出框是为了方便普通用户与服务器交互用的,所以有些特殊的字符普通用户是用不上的,在PHP中我们可以利用htmlspecialchars()、htmlentities()对HTML做实体转义。如以下字符会被转义为
&(和号)变为 &
"(双引号)变为 &quto;
'(单引号)变为 '
<(小于)变为 ≪
>(大于)变为 >
同样我们可以对我们的输入输出做一些编码转换,如HTML编码、CSS编码、JavaScript编码等。
总结
防御XSS的难度远高于防御SQL注入,因为对用户输入做过滤是一个大工程,既要不影响用户的浏览体验,还要防御XSS,而且在客户端用户输入的东西也是千奇百怪,XSS的攻击手法也是层出不穷。不过这些手段也都是可以杜绝的,这就要大家坚持不懈的学习了。当然文中所写并没有全面写出防御XSS的方法,实力有限,更多方法还需大家从原理入手,坚持不懈的去学习。