那么如何阻止xss呢?
①htmlspecialchars配合htmlspecialchars_decode过滤
这里的过滤不是为了阻止xss,而是为了防止其他攻击。
htmlspecialchars($data, ENT_QUOTES, 'UTF-8'); htmlspecialchars_decode($data, ENT_QUOTES);
②把不允许使用的标签过滤:
function editor_safe_replace($content){ $tags = array( "'<iframe[^>]*?>.*?</iframe>'is", "'<frame[^>]*?>.*?</frame>'is", "'<script[^>]*?>.*?</script>'is", "'<head[^>]*?>.*?</head>'is", "'<title[^>]*?>.*?</title>'is", "'<meta[^>]*?>'is", "'<link[^>]*?>'is", ); return preg_replace($tags, "", $content); }
这个能过滤大部分恶意标签,同时我们不能忽略标签事件也会被人利用攻击。例如<p onclick="alert(1);"></p>,所以还要用xss.js来过滤。
③使用xss.js过滤标签事件
<div class="content"> <script> document.write(filterXSS('<?=htmlspecialchars_decode($article['content'], ENT_QUOTES)?>')); </script> </div>
这个库能过滤标签上的所有事件
xss.js中文官网:http://jsxss.com/zh/index.html
cdn资源:https://cdn.bootcss.com/js-xss/0.3.3/xss.min.js
2017年10月30日增加:
④CSP(Content Security Policy)内容安全策略检查
CSP是减少XSS攻击一个策略。如果我们只允许加载自己域的图片的话,可以加上下面这个meta标签:
<meta http-equiv="Content-Security-Policy" content="img-src 'self';">或者是后端设置这个http响应头。
可选择限制列表
script-src:外部脚本
style-src:样式表
img-src:图像
media-src:媒体文件(音频和视频)
font-src:字体文件
object-src:插件(比如 Flash)
child-src:框架
frame-ancestors:嵌入的外部资源(比如<frame>、<iframe>、<embed>和<applet>)
connect-src:HTTP 连接(通过 XHR、WebSockets、EventSource等)
worker-src:worker脚本
manifest-src:manifest 文件
frame-ancestors:限制嵌入框架的网页
base-uri:限制<base#href>
form-action:限制<form#action>
block-all-mixed-content:HTTPS 网页不得加载 HTTP 资源(浏览器已经默认开启)
upgrade-insecure-requests:自动将网页上所有加载外部资源的 HTTP 链接换成 HTTPS 协议
plugin-types:限制可以使用的插件格式
sandbox:浏览器行为的限制,比如不能有弹出窗口等。
过滤函数出自:http://bbs.csdn.net/topics/320144592
CSP出自:https://juejin.im/entry/59f6081e51882554f6661403?utm_source=gold_browser_extension
以及:
作者:阿里聚安全
链接:https://www.zhihu.com/question/21979782/answer/122682029
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
来自ansion博客
2017-10-29 20:18:38