跨站请求伪造 C
ross S
ite R
equest F
orgery
原理
黑客构造了一个目标网站的请求,但是自己提交不了,因为没法通过网站验证
用户恰好登录了该目标网站,本地存有通过验证的cookie
黑客把网页请求伪装在钓鱼网站上,发给用户,诱使用户发起请求
- 伪造GET: 构造URL, 诱导点击
- 伪造POST: 构造页面,诱导打开,点击提交表单或者直接js发起ajax
效果是用户在不知情的情况下发起了请求,携带了合法cookie,执行了一次操作
防范
验证Referer字段
Http头Referer记录请求来源地址,正常情况下在目标网站的操作,请求来源都是目标网站
黑客的诱导网页部署在其他服务器上,点击后请求的来源会记录这个非官方地址
然而Referer值由浏览器填充,有个别的可以篡改,另外这个功能可以被用户关闭
不用GET执行修改
黑客只能诱使客户发送请求,因为同源的限制,并不能接收到返回值
所以会产生数据改变的服务需要保护起来,不能使用GET,而读取操作无需保护
如果服务端不接受跨域,那么也无法在浏览器伪造POST
请求携带token参数
服务端每次返回页面,附带一个难以预测的随机数,客户端可以存在Cookie里或者在页面隐藏域,服务端存在Session中。每次发起请求需要携带token,服务器验证token成功后才执行业务
原理是攻击者CSRF只是利用浏览器自动携带cookie的特性,并不能进行其他操作,不能预先构造出Post请求中token值
携带方式
- 如果是表单提交,页面上表单直接含有隐藏的token域并且填好token值
- 如果是动态XMLHttpRequest请求比如ajax,可以把Cookie中token放到请求头里比如
X-CSRF-Token:$.cookie("csrftoken")
Token原理还可用于防范重复提交,成功后服务端要更新token
人机交互
敏感操作需要额外手段确认,比如发短信
版权声明
This site by Linest is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由Linest创作并维护的博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文永久链接:http://linest.github.io/2017/03/23/security-attack-csrf/