## 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, '&');
str= str.replace(/</g, '<');
str = str.replace(/>/g,'>');
str = str.replace(/''/g,'&quto;');
str = str.replace(/'/, ''')
str = str.replace(/`/g, '`')
str = str.replace(/\\//g, '/');
return str
}
~~~
转义成:
~~~
// -> <script>alert(1)</script>
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<script>alert("xss");</script> console.log(html)
~~~
以上示例使用了**js-xss来实现**,可以看到输出中**保留了h1标签且过滤了script标签**
2. CSP
CSP本质上就是**建立白名单**,开发者明确**告诉浏览器哪些外部资源可以加载和执行**。我们只需要配置规则,如何拦截由浏览器自己实现。我们可以通过这种方式来尽量减少XSS攻击
* 设置HTTP Header中的Content-Security-Policy
* 设置meta标签的方式<meta http-equiv="Content-Security-Policy">
3.
- 空白目录
- 双樾
- JS基础知识
- JS-WEB-API
- 开发环境
- 运行环境
- ES6
- 原型
- 异步
- 虚拟dom
- mvvm
- 组件化和React
- hybrid
- 其他
- 补充
- 技巧
- 快乐动起来呀
- css
- 掘金小册子
- js基础知识
- ES6知识点
- JS异步
- JS进阶知识
- 思考题
- DevTools Tips
- 浏览器基础知识
- 浏览器缓存机制0
- 浏览器渲染原理
- 安全防范知识点0
- 从V8中看JS性能优化0
- 性能优化琐碎事
- Webpack性能优化0
- 实现小型打包工具0
- React和Vue
- Vue生命周期
- vue基础知识点
- Vue响应式
- vue高级
- React基础
- Vue.js技术解密
- 准备工作
- 数据驱动
- new Vue()
- vue实例挂载
- 组件化
- 深入响应式原理
- 编译
- 扩展
- Vue Router
- Vuex