XSS攻击与防范
1.什么是XSS攻击
XSS攻击,跨站脚本攻击
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
xss攻击,就是给form表单的项目里边填写一些html、css、js等脚本代码,这些代码就会被收集到数据库里边,当对应的内容展示的时候,这些脚本代码,就会执行,造成攻击效果
一般收集form表单信息,要做“表单验证”工作,而该工作可以完全杜绝xss产生。
理想情况下:每个form表单都实现表单验证工作
现实情况是:只有少量form表单适合做验证,其他大量form表单不适合做验证
为什么呢,form表单做验证会影响用户使用体验,另一个会增加程序员开发、维护程序的难度
xss攻击效果:
![](http://upload-images.jianshu.io/upload_images/5517042-7731523b2261fe25.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
首先,在GoodsController.class.php控制器里边要收集$_POST原生数据信息:
添加商品,进行xss攻击
![](http://upload-images.jianshu.io/upload_images/5517042-a45db92a1a1c536a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
后期每次查看商品列表,都会有xss攻击效果:
![](http://upload-images.jianshu.io/upload_images/5517042-2a89c66eddbc0c7b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.防范XSS攻击
2.1 普通表单域
① 在普通的form表单中 通过htmlspecialchars()函数收集处理数据
② 在tp框架的form表单中 通过I()函数或create()方法收集处理数据
它们的关系如下:
create()—>>—I()—>>—htmlspecialchars()
以上函数会把脚本攻击内容中的<>箭头符号都变为符号实体,进而杜绝xss攻击
2.2 富文本编辑器
1) 在编辑器中正常写入xss攻击内容
ueditor本身并没有那么笨,其会防止xss攻击的,因此无需多虑
![](http://upload-images.jianshu.io/upload_images/5517042-9c40ce8fcc05851d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
攻击失败,效果如下:
![](http://upload-images.jianshu.io/upload_images/5517042-e0765ae010a62b50.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
通过变形方式设置攻击
形成攻击步骤:
① 正常设置富文本编辑器内容
② 点击“HTML源代码标签”
③ 在 源代码 框里边设置xss攻击内容
④ 再点击 “HTML源代码标签”切换回正常的状态
之后信息保存会形成攻击
![](http://upload-images.jianshu.io/upload_images/5517042-929af0dc5d449164.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/5517042-26ceb31a3108ca7a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
富文本编辑器xss攻击防范处理手段:
① 把“HTML源代码”标签给去除[不推荐]
② htmlpurifier防止xss攻击
![](http://upload-images.jianshu.io/upload_images/5517042-b07ea492f941187c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.3 htmlpurifier防范xss攻击
htmlpurifier是在htmlspeciachars()不能使用情况下的另一个解决方案
该htmlpurifier可以限制被处理的内容中是否可以出现某些脚本(html标签、css、js)内容或不出现某些脚本
htmlpurifier会把xss攻击的非法内容直接删除
htmlspeciachars则是把脚本标签的”<>箭头符号”变为符号实体
① 引入功能包到项目中
解压关键的功能包目录出来
![](http://upload-images.jianshu.io/upload_images/5517042-810e38a178ab0a7f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/5517042-56ccc8e96b8d2210.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
② 形成过滤函数
系统函数库文件:
ThinkPHP/Common/functions.php 系统函数库文件
Application/Common/Common/function.php 项目函数库文件(所有分组都可以使用)
Application/分组(Home或Admin)/Common/function.php 项目中具体某个分组的函数库文件
tp框架中,一个php文件需要引入另一个php文件
我们通常设置相对路径引入文件,在任何一个php文件里边引入其他php文件都是相对入口文件index.php设置的
在Application/Common/Common/function.php文件中制作htmlpurifier过滤函数:
![](http://upload-images.jianshu.io/upload_images/5517042-18d1b736885e1ed6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
③ xss攻击的防范效果
在控制器中对收集的信息实现htmlpurifier处理:
![](http://upload-images.jianshu.io/upload_images/5517042-53c6f9751ddefbf3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
htmlpurifier防止xss攻击效果:
![](http://upload-images.jianshu.io/upload_images/5517042-6ac3a6f734c4c1b3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
数据库收集的信息没有看到xss攻击内容:
![](http://upload-images.jianshu.io/upload_images/5517042-6e03c0b2f7d14e09.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)