跨站请求伪造-Cross-site request forgery

跨站请求伪造[编辑]

维基百科,自由的百科全书php

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,一般缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登陆的Web应用程序上执行非本意的操做的攻击方法。[1] 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。web

 

目录

  [隐藏浏览器

 

攻击的细节[编辑]

跨站请求攻击,简单地说,是攻击者经过一些技术手段欺骗用户的浏览器去访问一个本身曾经认证过的网站并执行一些操做(如发邮件,发消息,甚至财产操做如转帐和购买商品)。因为浏览器曾经认证过,因此被访问的网站会认为是真正的用户操做而去执行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求自己是用户自愿发出的安全

例子[编辑]

假如一家银行用以执行转帐操做的URL地址以下: http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName服务器

那么,一个恶意攻击者能够在另外一个网站上放置以下代码: <img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">cookie

若是有帐户名为Alice的用户访问了恶意站点,而她以前刚访问过银行不久,登陆信息还没有过时,那么她就会损失1000资金。session

这种恶意的网址能够有不少种形式,藏身于网页中的许多地方。此外,攻击者也不须要控制放置恶意网址的网站。例如他能够将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着若是服务器端没有合适的防护措施的话,用户即便访问熟悉的可信网站也有受攻击的危险网站

透过例子可以看出,攻击者并不能经过CSRF攻击来直接获取用户的帐户控制权,也不能直接窃取用户的任何信息。他们能作到的,是欺骗用户浏览器,让其以用户的名义执行操做spa

防护措施[编辑]

检查Referer字段[编辑]

HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪一个地址。在处理敏感数据请求时,一般来讲,Referer字段应和请求的地址位于同一域名下。以上文银行操做为例,Referer字段地址一般应该是转帐按钮所在的网页地址,应该也位于www.examplebank.com之下。而若是是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,不会位于www.examplebank.com之下,这时候服务器就能识别出恶意的访问。token

这种办法简单易行,工做量低,仅须要在关键访问处增长一步校验。但这种办法也有其局限性,因其彻底依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并没有法保证来访的浏览器的具体实现,亦没法保证浏览器没有安全漏洞影响到此字段。而且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。

添加校验token[编辑]

因为CSRF的本质在于攻击者欺骗用户去访问本身设置的地址,因此若是要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,而且攻击者没法伪造的数据做为校验,那么攻击者就没法再执行CSRF攻击。这种数据一般是表单中的一个数据项。服务器将其生成并附加在表单中,其内容是一个伪乱数。当客户端经过表单提交请求时,这个伪乱数也一并提交上去以供校验。正常的访问时,客户端浏览器可以正确获得并传回这个伪乱数,而经过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪乱数的值,服务器端就会由于校验token的值为空或者错误,拒绝这个可疑请求。

参考资料[编辑]

  1. ^ Ristic, Ivan. Apache Security. O'Reilly Media. 2005: 280. ISBN 0-596-00724-8.
相关文章
相关标签/搜索