ASP.NET MVC 和网页中的 XSRF/CSRF 防护
03/14/2013
本文内容
跨站点请求伪造(也称为 XSRF 或 CSRF)是一种针对 Web 托管型应用程序的攻击,恶意网站凭此可以影响客户端浏览器与受该浏览器信任的网站之间的交互。 这些攻击出现的原因可能是 Web 浏览器针对每一个对网站的请求自动发送身份验证令牌。 典型示例是身份验证 cookie,如 ASP.NET 的表单身份验证票证。 然而,使用任何持久身份验证(如 Windows Authentication、Basic 等)的网站也可能成为受攻击目标。
XSRF 攻击不同于网络钓鱼攻击。 网络钓鱼攻击需要与受害者进行交互。 在网络钓鱼攻击中,恶意网站将仿冒目标网站,受到欺骗的受害者会向攻击者提供敏感信息。 在 XSRF 攻击中,通常不必与受害者进行交互。 相反,浏览器自动向目标网站发送所有相关 cookie 为攻击者提供了可乘之机。
攻击剖析
若要演练 XSRF 攻击,请考虑要执行一些在线银行交易的用户。 此用户先访问 WoodgroveBank.com 并登录,此时响应标头将包含她的身份验证 cookie:
HTTP/1.1 200 OK
Date: Mon, 18 Jun 2012 21:22:33 GMT
X-AspNet-Version: 4.0.30319
Set-Cookie: .ASPXAUTH={authentication-token}; path=/; secure; HttpOnly;
{ Cache-Control, Content-Type, Location, Server and other keys/values not listed. }
因为身份验证 cookie 是会话 cookie,浏览器在浏览器进程退出时会自动将其清除。 但在此之前,浏览器将自动在每个请求中包括 cookie 和 WoodgroveBank.com。 用户现在想要将 $1000 传输到另一个帐户,因此她在银行站点上填写表单,浏览器向服务器发出此请求:
POST /DoTransfer HTTP/1.1
Host: WoodgroveBank.com
Content-Type: application/x-www-form-urlencoded
Cookie: .ASPXAUTH={authentication-token}
toAcct=12345&amount=1,000.00
由于此操作在启动货币交易) (有副作用,因此银行站点已选择要求 HTTP POST 以便启动此操作。 服务器从请求中读取身份验证令牌,查找当前用户的帐号,验证是否存在足够的资金,然后启动该事务进入目标帐户。
她的在线银行完成后,用户离开银行网站并访问 web 上的其他位置。 其中一个站点– fabrikam.com –在某个已嵌入到 iframe 中的页面上包含以下标记 < > :
document.getElementById('theForm').submit();
然后,它将导致浏览器发出此请求:
POST /DoTransfer HTTP/1.1
Host: WoodgroveBank.com
Content-Type: application/x-www-form-urlencoded
Cookie: .ASPXAUTH={authentication-token}
toAcct=67890&amount=250.00
攻击者利用这一事实,用户可能仍具有适用于目标网站的有效身份验证令牌,而她使用 Javascript 的小片段来使浏览器自动向目标站点发出 HTTP POST。 如果身份验证令牌仍然有效,银行站点将启动 $250 到攻击者选择的帐户的传输。
低效缓解
请注意,在上面的方案中,WoodgroveBank.com 是通过 SSL 访问的,并