CSRF攻击,Cross-site request forgery,跨站点请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。指攻击者通过跨站请求,以合法的用户的身份进行非法操作。
一、CSRF攻击的原理
攻击者盗用你的身份,以你的名义发邮件,发短信,进行交易转账,向第三方网站发送恶意请求,容易造成个人隐私泄露以及财产安全。
<a href="http://www.harmless.com/" onclick=" var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = 'http://www.example.com/account/destroy'; f.submit(); return false;">伪装的链接</a>
二、CSRF攻击的防御
1、采用安全框架,例如Spring Security。
2、引入token机制。在HTTP请求中进行token验证,如果请求中没有token或者token内容不正确,则认为CSRF攻击而拒绝该请求。
CSRF攻击成功的条件在于攻击者能够准确地预测所有的参数从而构造出合法的请求,于是我们可以保持原有参数不变,添加一个参数Token随机值。这样,攻击者因为不知道Token而无法构造出合法的请求进行攻击,所以我们在构造请求时只需保证:
- Token具有随机性,使攻击者无法准确预测;
- Token具有一次性,即每次请求成功后要更新Token,增加预测难度;
- Token具有保密性,敏感操作使用POST,防止Token出现在URL中;
过滤用户输入的内容不能阻挡CSRF攻击,我们需要做的是过滤请求的来源,因为有些请求是合法的,有些是非法的,所以CSRF防御主要是过滤那些非法伪造的请求来源。
3、验证码。通常情况下,验证码能够很好的遏制CSRF攻击,然而,考虑到用户体验,验证码只能作为一种辅助手段,而不是最主要的解决方案。
4、referer识别。在HTTP Header中有一个字段referer,它记录了HTTP请求的来源地址。如果referer是其他网站,就有可能是CSRF攻击,则拒绝该请求。但是,服务器并非都能取到referer。很多用户出于隐私保护的考虑,限制了referer的发送。在某些情况下,浏览器也不会发送referer,例如从HTTPS跳转到HTTP。referer Check只能用于监控CSRF攻击的发生,而不用来抵御攻击。