什么是CSRF

跨站点请求伪造(CSRF),也称为XSRF,Sea Surf或Session Riding,是一种攻击媒介,它诱使Web浏览器在用户登录的应用程序中执行不需要的操作。

成功的CSRF攻击对企业和用户而言都是灾难性的。它可能导致客户关系损坏,未经授权的资金转移,更改的密码和数据盗窃(包括会话cookie被盗)。

CSRF通常是使用恶意的社交工程进行的,例如电子邮件或诱骗受害者向服务器发送伪造请求的链接。由于攻击时毫不怀疑的用户会通过其应用程序进行身份验证,因此无法将合法请求与伪造请求区分开。

csrf

CSRF示例

在执行攻击之前,作案者通常会研究应用程序,以使伪造的请求看起来尽可能合法。

例如,典型的GET要求进行$ 100的银行转帐,如下所示:

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">Read more!</a>

接下来,他可以通过电子邮件将超链接分发给大量银行客户。那些在登录到银行帐户后单击链接的人将无意中启动$ 100的转帐。

请注意,如果银行的网站仅使用POST请求,则无法使用<a> href标签对恶意请求进行陷害。但是,可以使用自动执行嵌入式JavaScript的<form>标记进行攻击。

这样的形式可能是这样的:

<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攻击的有效方法。从用户的角度来看,预防是维护登录凭据并拒绝未经授权的参与者访问应用程序的问题。

最佳做法包括:

  • 不使用时注销Web应用程序
  • 保护用户名和密码
  • 不允许浏览器记住密码
  • 避免在登录应用程序时同时浏览

对于Web应用程序,存在多种解决方案来阻止恶意流量并防止攻击。最常见的缓解方法之一是为每个会话请求或ID生成唯一的随机tokens。服务器随后对它们进行检查和验证。具有重复tokens或缺少值的会话请求将被阻止。另外,也可以阻止与其会话ID token不匹配的请求到达应用程序。

重复提交Cookie是另一种众所周知的阻止CSRF的方法。与使用唯一tokens类似,将随机tokens分配给Cookie和请求参数。然后,服务器在授予对应用程序的访问权之前验证tokens是否匹配。

在有效的情况下,如果受保护的站点链接到外部URL,则可以在多个点公开tokens,包括在浏览器历史记录,HTTP日志文件,记录HTTP请求第一行的网络设备和referrer headers中。这些潜在的缺陷使tokens不如完全验证的解决方案。

使用custom rules来防止CSRF攻击

CSRF攻击的高度个性化特性阻碍了“一刀切”解决方案的开发。但是,可以采用自定义安全策略来防止可能的CSRF情况。

使用IncapRules,您可以创建一个策略,该策略根据您的HTTP Referrer标头内容过滤对敏感页面和功能的请求。这样做可以从简短的安全域列表中执行请求。

这种方法完全可以抵抗CSRF攻击的社会工程方面。无论内容如何,​​它都可以防止在安全范围之外执行恶意请求。

Cross site request forgery (CSRF) attack