什么是CSRF攻击
CSRF(Cross Site Request Forgery)攻击,即跨站请求伪造,是一种常见的Web攻击。
攻击者可以盗用我们的登陆信息,以我们的身份模拟发送各种请求。
例如:我们正常打开一个网站,输入账号密码登陆,此时服务器会返回一个cookie,浏览器将其保存在本地来识别身份信息。
这时如果我们不小心打开了一个钓鱼网站,这个钓鱼网站就可以带着cookie冒充我们为所欲为。
归根结底是源于Web的隐式身份验证,Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。
1. CSRF攻击的发生有三个必要条件:
已经登录一个站点,并在本地保存下cookie。
在没有退出刚刚站点的情况下,打开了某第三方钓鱼网站或网站本身存在问题。
原站点没有CSRF防护
前两个条件我们很难完全杜绝,所以为了保证安全,网站必须有必要的CSRF防护机制。
2.几种防护方法:
我们已经知道CSRF攻击的原理是伪造用户请求,所以我们防护的时候就要从这里出发,试想如果我们的请求里有黑客伪造不出来的东西那就可以杜绝这种攻击方式了。
对于POST请求使用验证码,这个方案可以完全杜绝CSRF攻击,但验证码过多会使用户体验很差,所以可以对敏感操作加验证码。
非GET请求中添加token,当客户端请求页面,服务器渲染页面时给每个表单生成一个随机数token,并且将token放置到session当中,然后将token发给客户端(一般通过构造hidden表单)。下次客户端提交请求时,token会随着表单一起提交到服务器端。接收到请求后,服务器端会对token值进行验证,判断是否和session中的token值相等,如果不相等则拒绝访问。
CSRF的防御工作确实会在正常业务逻辑的基础上带来很多额外的开发量,但是这种工作量是值得的,毕竟用户隐私以及财产安全是产品最基础的根本。