🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## XSS 什么是XSS攻击?如何防范XSS攻击?什么是CSP? XSS:就是攻击者想尽一切办法将可以**将执行的代码注入到网页**中。 XSS可以分为多种类型,总体两类:**持久型和非持久型**。 **持久型**就是**攻击的代码被服务端写入数据库中**。攻击危害性很大,如果网站访问量很大的话,就会导致大量正常访问页面的用户收到攻击。 对于评论功能来说,就得防范持久型XSS攻击, ![](https://box.kancloud.cn/84224ebb2c6c76e4dfb57bbd3c1769e5_977x184.png) 这种情况如果前后端没有做好防御,这段评论会被存储到数据库中,这样每个打开该页面的用户都会被攻击到 **非持久型**,相比于前者危害小了,一般通过**修改URL参数的方式加入攻击代码**,诱导用户访问链接从而进行攻击。 例如:如果页面需要从URL中获取某些参数作为内容的话,不经过过滤就会导致攻击diam被执行。 ~~~ <!-- http://www.domain.com?name=<script>alert(1)</script> --> <div>{{name}}</div> ~~~ 但是对于这种攻击方式来说,如果用户使用chrome这类浏览器,浏览器会自动帮助用户防御攻击,但我们不能因此就不防御此类攻击了,因为不能保证用户都使用了这类浏览器 ![](https://box.kancloud.cn/2fda5e429dfddd21225a0beb4ec19fa4_943x414.png) 对于XSS攻击来说,通常有两种方式可以用来防御。 1. 转义字符 首先,对于用户的输入应该是永远不信任的,最普遍的做法就是转义输入输出的内容,独有引号、尖括号、斜杠进行转义 ~~~ function escape(str){ str = str.replace(/&/g, '&amp;'); str= str.replace(/</g, '&lt;'); str = str.replace(/>/g,'&gt;'); str = str.replace(/''/g,'&quto;'); str = str.replace(/'/, '&#39;') str = str.replace(/`/g, '&#96;') str = str.replace(/\\//g, '&#x2F;'); return str } ~~~ 转义成: ~~~ // -> &lt;script&gt;alert(1)&lt;&#x2F;script&gt; escape('<script>alert(1)</script>') "%3Cscript%3Ealert%281%29%3C/script%3E" ~~~ 但是对于现实富文本来说,显然不能通过上面的办法来转义所有字符,因为这样**会把需要的格式也过滤掉**,通常采用**白名单过滤**的办法,当然也可以通过**黑名单过滤**,但是考虑到需要**过滤的标签和标签属性实在太多**,更加**推荐使用白名单**的方式。 ~~~ const xss = require('xss'); let html = xss('<h1 id="title" > XSS Demo </h1><script>alert("xss")<script>') // -> XSS Demo&lt;script&gt;alert("xss");&lt;/script&gt; console.log(html) ~~~ 以上示例使用了**js-xss来实现**,可以看到输出中**保留了h1标签且过滤了script标签** 2. CSP CSP本质上就是**建立白名单**,开发者明确**告诉浏览器哪些外部资源可以加载和执行**。我们只需要配置规则,如何拦截由浏览器自己实现。我们可以通过这种方式来尽量减少XSS攻击 * 设置HTTP Header中的Content-Security-Policy * 设置meta标签的方式<meta http-equiv="Content-Security-Policy"> 3.