CSRF(Cross - Site Request Forgery),中文名称为跨站请求伪造,是一种网络安全攻击方式。
一、攻击原理
- 用户认证状态利用
- 当用户登录一个受信任的网站(比如银行网站)并通过认证后,网站会在用户的浏览器端设置一些身份认证相关的信息,如cookies。这些cookies会在后续用户对该网站的请求中自动发送,以表明用户的身份是已经认证过的。
- 攻击者利用这一点,构造恶意请求。例如,攻击者创建一个恶意网页,在这个网页中包含一个自动提交的表单,表单的目标是用户已经登录的受信任网站的某个关键功能接口(如转账接口)。
- 诱导用户访问恶意页面
- 攻击者通过各种方式诱使受害者访问这个恶意网页,比如发送带有恶意链接的电子邮件、在社交网络上发布吸引人的链接等。
- 当用户访问这个恶意网页时,浏览器会自动将用户登录受信任网站的cookies等认证信息发送给受信任网站,因为浏览器无法区分这个请求是用户主动发起的还是被恶意诱导的。这样,恶意请求就会在用户已经认证的状态下被发送到受信任网站,从而执行一些对用户不利的操作,比如转账、修改密码等。
二、举例说明
- 假设用户在银行网站(bank.com)登录了自己的账户,此时浏览器保存了银行网站的身份认证cookies。
- 攻击者制作了一个恶意网站(evil.com),在这个网站的页面中有如下一段HTML代码:
<form action="https://bank.com/transfer" method="post"> <input type="hidden" name="toAccount" value="攻击者账户号码"> <input type="hidden" name="amount" value="1000"> <input type="submit" value="点击查看精彩内容"> </form> <script>document.forms[0].submit();</script>
- 当用户被诱骗访问evil.com时,页面会自动提交表单。浏览器会把用户在bank.com的认证cookies一起发送给bank.com,使得bank.com以为是用户自己发起的转账请求,从而将1000元转到攻击者账户。
- 攻击者制作了一个恶意网站(evil.com),在这个网站的页面中有如下一段HTML代码:
三、防御措施
- 使用CSRF令牌(Token)
- 受信任网站在生成表单或者关键的请求链接时,会生成一个随机的、唯一的CSRF令牌,并将其嵌入到表单或者请求链接中。
- 当用户提交请求时,服务器会验证这个令牌是否有效。如果请求中没有令牌或者令牌无效,服务器就拒绝该请求。例如,在一个基于Web的应用程序中,当用户访问转账页面时,服务器会生成一个类似于“abcdef123456”的CSRF令牌,将其放在一个隐藏的表单字段中,如
<input type="hidden" name="csrf_token" value="abcdef123456">
。当用户提交转账请求时,服务器会检查这个令牌是否和之前生成的一致。
- 检查请求来源(Referer)
- 服务器可以检查请求的来源(Referer头信息),确保请求是来自合法的源。不过这种方法有一定的局限性,因为Referer头信息可以被攻击者伪造或者在某些情况下(如用户隐私设置)可能不包含正确的信息。
- Same - Site Cookies策略
- 这是一种设置cookies属性的策略。通过将cookies标记为Same - Site,可以限制cookies只能在同站点请求中发送,从而防止跨站请求伪造。例如,将银行网站的cookies设置为Same - Site = Strict,那么当浏览器发起跨站请求时,就不会发送该银行网站的cookies,从而有效避免CSRF攻击。