什么是CSRF
跨站请求伪造(Cross-Site Request Forgery,CSRF),也称为XSRF、Sea Surf或Session Riding,是一种攻击向量,通过欺骗Web浏览器在用户已登录的应用程序中执行不需要的操作。
成功的CSRF攻击对企业和用户都可能造成巨大破坏。它可能导致客户关系受损、未经授权的资金转移、密码更改和数据窃取,包括被盗的会话cookie。
CSRF通常通过恶意社会工程手段进行,比如通过电子邮件或链接欺骗受害者向服务器发送伪造请求。由于在攻击时用户已经通过其应用程
序进行了身份验证,因此无法区分合法请求和伪造请求。

CSRF案例
在执行攻击之前,攻击者通常会研究一个应用程序,以使伪造的请求看起来尽可能合法。
例如,一个典型的用于转账100美元的GET请求可能如下所示:
GET http://netbank.com/transfer.do?acct=PersonB&amount=$100 HTTP/1.1
黑客可以修改这个脚本,使之导致100美元转账到他们自己的账户。现在,恶意请求可能如下所示:
GET http://netbank.com/transfer.do?acct=AttackerA&amount=$100 HTTP/1.1
不良行为者可以将这个请求嵌入到一个看似无害的超链接中:
<a href="http://netbank.com/transfer.do?acct=AttackerA&amount=$100">阅读更多!</a>
接下来,他可以通过电子邮件向大量银行客户分发这个超链接。那些在登录到他们的银行账户时点击该链接的人将无意中发起100美元的转账。
请注意,如果银行网站只使用POST请求,就无法使用<a> href标签来构建恶意请求。然而,攻击可以通过<form>标签传递,同时嵌入JavaScript以实现自动执行。
这是一个可能看起来这样的表单:
<body onload="document.forms[0].submit()">
<form action="http://netbank.com/transfer.do" method="POST">
<input type="hidden" name="acct" value="AttackerA"/>
<input type="hidden" name="amount" value="$100"/>
<input type="submit" value="View my pictures!"/>
</form>
</body>
CSRF(跨站请求伪造)缓解方法
存在许多有效的方法来预防和减轻CSRF攻击。从用户的角度来看,预防CSRF攻击的关键在于保护登录凭据,阻止未经授权的人员访问应用程序。
最佳实践包括:
- 在不使用时注销Web应用程序
- 保护用户名和密码
- 不允许浏览器记住密码
- 避免在登录到应用程序时同时进行浏览
对于Web应用程序,存在多种解决方案来阻止恶意流量并预防攻击。其中最常见的减轻方法之一是为每个会话请求或ID生成唯一的随机令牌。然后服务器会对这些令牌进行检查和验证。具有重复令牌或缺失值的会话请求将被阻止。另外,不符合其会话ID令牌的请求将被阻止进入应用程序。
双重提交Cookie是另一种阻止CSRF的常用方法。类似于使用唯一令牌,随机令牌分配给Cookie和请求参数。然后服务器在授予对应用程序的访问权限之前验证这些令牌是否匹配。
虽然令牌很有效,但可能会在多个点上暴露,包括在浏览器历史记录中、HTTP日志文件中、网络设备记录HTTP请求的第一行以及引用者标头中(如果受保护的站点链接到外部URL)。这些潜在的弱点使令牌成为一个并非完全可靠的解决方案。
使用自定义规则防止CSRF攻击
由于CSRF攻击的高度个性化特点,很难开发出适用于所有情况的解决方案。然而,可以使用自定义安全策略来防止可能的CSRF攻击场景。