跨站请求伪造–CSRF
简介
CSRF,全称为Cross-Site Request Forgery,跨站请求伪造,是一种网络攻击方式,它可以在用户毫不知情的情况下,以用户的名义伪造请求发送给被攻击站点,从而在未授权的情况下进行权限保护内的操作。
也就是说,攻击者借助合法用户的名义,在用户不知情的情况下发送了恶意(非用户意愿)的请求。服务器认为规则是合法的,但是用户却完成了一个恶意的操作(非用户意愿),比如评论,发邮件、购买商品等。
原理
- 用户使用账号密码登录网站A
- 网站会产生一个用于记住并保持账户状态的cookie。
- 用户在没有退出(此时没有删除cookie)网站A的时候访问了网B。
- 网站B返回一些攻击性代码,并发送访问网站A的请求。
- 用户浏览器在就收到攻击性代码之后,在用户不知情的情况下携带用户登录网站A时产生的cookie,用合法的身份恶意访问网站A。
解决方案
-
验证http Referer字段
根据HTTP协议,HTTP头中的字段Referer记录了HTTP请求的来源地址。用户在访问网站时在referer中记录http请求的来源地址(登录是的来源地址),以后的每次请求都需要验证referer是否正确(即与登录时的是否相同),因为攻击者如果要实行csrf攻击的话需要在自己的网站构造请求,那么referer中记录数据就是不相同的,攻击时请求验证不同过也就访问失败了。 -
构造不可预见性URL
CSRF能够攻击成功,其本质原因是请求的URL被攻击者猜到,构造不可预见性的url,在url中加入token,同时也存入cookie中存入token值,CSRF攻击只能利用cookie却不能获得里面的值,所以当发出请求时,判断url中的token值和cookie中取出的值是否一致,如果不一致就拒绝请求。
当然token也需要进行保密,建议使用使用post方式发生请求且token可不放在url中,放在要提交表单的隐藏域中进行提交,或者ajax形式提交。