反射型xss(防)
php中xss的漏洞防范方法总结:<参考自Segmentfault>
A. PHP直接输出html的,可以采用以下的方法进行过滤:
    1.htmlspecialchars函数
    2.htmlentities函数
    3.HTMLPurifier.auto.php插件
    4.RemoveXss函数
B. PHP输出到JS代码中,或开发Json API的,则需前端在JS中进行过滤:
    1.尽量使用innerText(IE)和textContent(Firefox),也就是  jQuery的text()来输出文本内容
    2.必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤
C. 其它的通用的补充性防御手段
    1.在输出html时,加上Content Security Policy的Http Header
    (作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等)
    (缺陷:IE或低版本的浏览器可能不支持)
    2.在设置Cookie时,加上HttpOnly参数
    (作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)
    (缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)
    3.在开发API时,检验请求的Referer参数
    (作用:可以在一定程度上防止CSRF攻击)
    (缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)
这里我们选用htmlentities()函数(把字符转换为 HTML 实体)进行测试:
新建Xss_htmlentities.php, 代码如下:
<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>XSS</title> 
</head> 
<body> 
<form action="" method="get"> 
<input type="text" name="input">     
<input type="submit"> 
</form> 
<br> 
<?php 
$XssReflex = $_GET['input'];
echo 'output:<br>'.htmlentities($XssReflex);#仅在这里对变量 $XssReflex 做了处理.
?> 
</body> 
</html> 

当我们输入<script>alert('xss')</script> :
点击查看代码
可以看到页面并没有弹窗,查看网页html代码:

看到htmlentities()函数对用户输入的<>做了转义处理,恶意代码当然也就没法执行了。
XSS防御的总体思路是:
对用户的输入(和URL参数)进行过滤,对输出进行html编码。
也就是对用户提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;
然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。
对输入的内容进行过滤,可以分为黑名单过滤和白名单过滤。
黑名单过滤虽然可以拦截大部分的XSS攻击,但是还是存在被绕过的风险。
白名单过滤虽然可以基本杜绝XSS攻击,但是真实环境中一般是不能进行如此严格的白名单过滤的。
对输出进行html编码,就是通过函数,将用户的输入的数据进行html编码,使其不能作为脚本运行。
我们还可以服务端设置会话Cookie的HTTP Only属性,这样,客户端的JS脚本就不能获取Cookie信息了

                
            
        
浙公网安备 33010602011771号