XSS :cross site script 跨站脚本攻击
比如在input框中输入script代码
<script>alert('hehehe')</script>
1.危害
获取页面数据、获取Cookie、劫持前端逻辑、发送请求、偷取用户资料...
2.攻击方法
url中注入脚本
查询框注入脚本
存储型注入,通过form表带提交到数据库中
3.要防护的地方
动态生成的HTML节点、HTML属性(如src),依赖与用户输入的JS代码,富文本等
富文本例子.png
4.防御方法
1)对HTML内容和属性实体进行转义escape
< --------> <
> --------> >
" --------> &quto; 或"
' --------> 或'
&符号可转可不转,空格一般不做转义,但是要求html中属性值必须加上引号
2)对JS做转义
加 \ 或者转为JSON
str = str.replace(/\\/g, '\\\\');
str = str.replace(/"/g, '\\"');
str = str.replace(/'/g, "\\'");
//or
str = JSON.stringify(str);
3)对于富文本,黑名单方法过滤指定标签(如<script>),或白名单方法只支持指定标签
html = html.replace(/<\s*\/?script\s*>/g, '');
由于XSS攻击方式变种非常多,所以推荐白名单的方式防御,可用cheerio库
4)浏览器内置防御机制
防御效果有限,只对url参数中的script有效
5.CSP
CSP: Content security policy 内容安全策略
用于指定哪些内容可执行,通过CSP所约束的的规责指定可信的内容来源。
在HTTP头中加入属性Content-Security-Policy,并写入常用的指令:
- default-src 默认策略,可以应用于js文件/图片/css/ajax请求等所有访问
- script-src 定义js文件的过滤策略
- style-src 定义css文件的过滤策略
- object-src 定义页面插件的过滤策略,如 <object>, <embed> 或者<applet>等元素
- 还有img-src、connect-src、font-src、media-src、frame-src等
- sandbox 沙盒模式,会阻止页面弹窗/js执行等
并在服务器端进行相应的配置
- Apache,在VirtualHost的httpd.conf文件或者.htaccess文件中加入以下代码
Header set Content-Security-Policy "default-src 'self';"
- Nginx,在 server {}对象块中添加如下代码
add_header Content-Security-Policy "default-src 'self';";
- IIS, 在web.config中添加
6.PHP中的XSS防御
1.strip_tags():移除所有html标签,只留下内容
2.htmlspecialchars($content, ENT_NOQUOTES):对& < >等特殊字符做转义
3.使用各种第三方库,如HTMLPurifier
4.用php Document类解析Dom节点,根据白名单过滤
5.CSP
网友评论