跨站请求伪造攻击

跨站请求伪造 Cross Site Request Forgery

原理


黑客构造了一个目标网站的请求,但是自己提交不了,因为没法通过网站验证
用户恰好登录了该目标网站,本地存有通过验证的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

人机交互

敏感操作需要额外手段确认,比如发短信