说到CSRF很多小伙伴应该很清楚了,不清楚也没关系,我们下面就来探讨一下。
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
以上内容来自百度百科
那么接下来我们详细讨论一下跨站请求伪造:
跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
理解 CSRF 攻击的最好方法是看一个具体的例子。
假设您的银行网站提供了一个表单,允许将资金从当前登录的用户转移到另一个银行账户。例如,转账表格可能如下所示:
<form method = "post" action = "/transfer" ><input type = "text" name = "amount" /><input type = "text" name = "routingNumber" /><input type = "text" name = "account" /><输入类型= “提交” 值= “传输” /></form>
相应的 HTTP 请求可能如下所示:
传输 HTTP 请求
POST /传输 HTTP/1.1
主机:bank.example.com
cookie:JSESSIonID=randomid
内容类型:应用程序/x-www-form-urlencoded
金额=100.00&routingNumber=1234&account=9876
现在假设您对银行网站进行了身份验证,然后在不注销的情况下访问一个邪恶的网站。该邪恶网站包含一个 HTML 页面,其格式如下
邪恶转移形式
<form method = "post" action = "https://bank.example.com/transfer" ><input type = "hidden" name = "amount" value = "100.00" /><input type = "hidden" name = "routingNumber" value = "evilsRoutingNumber" /><input type = "hidden" name = "account" value = "evilsAccountNumber" /><input type = "submit" value = "Win Money!" /></form>
你喜欢赢钱,所以你点击提交按钮。在此过程中,您无意中向恶意用户转移了 100 美元。发生这种情况的原因是,虽然恶意网站无法看到您的 cookie,但与您的银行关联的 cookie 仍会随请求一起发送。
最糟糕的是,这整个过程本可以使用 Javascript 实现自动化。这意味着您甚至不需要单击按钮。此外,在访问作为XSS 攻击受害者的诚实站点时,它也很容易发生。那么我们如何保护我们的用户免受此类攻击呢?
那么我们又有哪些方式可以解决,或者避免这种CSRF攻击呢,欢迎留下大家的见解