浅谈xss——跨站脚本攻击(四)
前文:
讲了这么多攻击方式,这次讲一讲防范方法
反射型xss漏洞防范
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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()函数进行测试:
htmlentities() 函数把字符转换为 HTML 实体。
新建Xss_htmlentities.php文件,插入以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<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> |
打开页面,输入
可以看到页面并没有弹窗。
查看网页html代码,可以看到htmlentities()函数对用户输入的<>做了转义处理,恶意代码当然也就没法执行了。
存储型xss漏洞防范
存储型XSS对用户的输入进行过滤的方式和反射型XSS相同,这里我们使用htmlspecialchars()函数进行演示:
1 2 3 4 |
htmlentities() :把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体 htmlspecialchars和htmlentities的区别: htmlspecialchars 只转义 & 、" 、' 、< 、> 这几个html代码, 而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也会转化。 |
新建Xss_htmlspecialchars.php文件,并插入以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<span style="font-size:18px;"><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <html> <head> <title>XssStorage</title> </head> <body> <h2>Message Board<h2> <br> <form action="Xss_htmlspecialchars.php" method="post"> Message:<textarea id='Mid' name="desc"></textarea> <br> <br> Subuser:<input type="text" name="user"/><br> <br> <input type="submit" value="submit" onclick='loction="XssStorage.php"'/> </form> <?php if(isset($_POST['user'])&&isset($_POST['desc'])){ $log=fopen("sqlStorage.txt","a"); fwrite($log,htmlspecialchars($_POST['user'])."\r\n"); # 在此对用户输入数据$_POST['user']进行过滤 fwrite($log,htmlspecialchars($_POST['desc'])."\r\n"); # 在此对用户输入数据$_POST['desc']进行过滤 fclose($log); } if(file_exists("sqlStorage.txt")) { $read= fopen("sqlStorage.txt",'r'); while(!feof($read)) { echo fgets($read)."</br>"; } fclose($read); } ?> </body> </html> </span> |
打开页面,在Message中输入
可以看到页面并没有弹窗。查看网页html代码,可以看到htmlspecialchars()函数对用户输入的<>做了转义处理。
行云博客 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我([email protected])联系处理。敬请谅解!
本文链接:https://www.xy586.top/772.html
转载请注明文章来源:行云博客 » 浅谈xss——跨站脚本攻击(四)