简介
Cross-site request forgery(跨站请求伪造)
wikipedia:
是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法
过程
- 用户登陆一个网站a,本地生成cookie
-
在未退出a的情况下,访问b网站。
CSRF攻击流程
HTTP Cookie:
当服务器收到HTTP请求时,可以在响应头中增加一个Set-Cookie头部。浏览器收到响应后通常会保存Cookie,之后对该服务器每一次请求中都通过Cookie请求头部将Cookie信息发送给服务器。
会话状态管理(如用户登录状态、购物车、游戏分数和其它需要记录的信息)
个性化设置(如用户自定义设置、主题等)
浏览器行为跟踪(如跟踪分析用户行为)
例子
假如一家银行用以执行转账操作的URL地址如下: http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
那么,一个恶意攻击者可以在另一个网站上放置如下代码: <img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">
如果有账户名为Alice的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失1000资金。
防范
- 检查Referer字段
HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。以上文银行操作为例,Referer字段地址通常应该是转账按钮所在的网页地址,应该也位于www.examplebank.com之下。而如果是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,不会位于www.examplebank.com之下,这时候服务器就能识别出恶意的访问。 - 在请求地址中添加 token 并验证.
- 服务端在收到路由请求时,生成一个随机数,在渲染请求页面时把随机数埋入页面(form表单中 <input type="hidden" name="_csrf_token" value="xxx" )
- 服务端设置setCookie,把该随机数作为cookie或者session返回用户浏览器
- 当用户发送 GET 或者 POST 请求时带上参数
- 后台在接受到请求后解析请求的cookie获取参数的值,然后和用户请求提交的_csrf_token做个比较,如果相等表示请求合法。
网友评论