notesResource/网络安全/CSRF - 跨站点请求伪造.md

CSRF - 跨站点请求伪造

CSRF 是恶意站点或程序通过已认证用户的浏览器在受信任站点上执行恶意操作。可执行的恶意操作的范围局限为已认证用户的权限范围。

CSRF 是如何工作的

  • 攻击者想在被攻击的网站中通过请求(GET 或 POST)的方式执行某种操作,如转账或修改密码
  • 攻击者知道执行该操作的请求的所有参数
  • 该操作仅依赖 Cookie 验证请求是否来自于已验证的用户

CSRF 示例

用户 A 正在银行转账界面使用 GET 请求向用户 B 转账 10 元

http://bank.com/transfer?recipient=B&amount=10

该转账请求包含两个参数:

  • recipient: 被转账人
  • amount: 转账金额

该请求还包含一个 Cookie,用来存放用户 A 的信息。

现在,攻击者可以伪造一个 GET 请求来将用户 A 的存款转移给任意的人。

http://bank.com/transfer?recipient=攻击者&amount=1000

要使上面的攻击生效,按照 CSRF 是如何工作的 中描述,还差两步,一是让用户 A 发起这个请求,二是让这个请求包含存放用户 A 的信息的 Cookie。要实现这两步,有一个办法,那就是在银行转账页面注入一个链接,该链接中包含上述请求,这样用户 A 点击这个链接之后,既满足了用户点击请求操作,浏览器又自动给请求加上了包含用户认证信息的 Cookie。

这里就有一个问题了,银行转账界面为什么会有这个链接,用户又为何会点击这个链接呢?答案就是本文的标题——CSRF,跨站点请求伪造。攻击者通过 CSRF,在目标网站生成带有诱惑性的链接,通过诱导用户点击的方式实现自己的攻击目的。

如何防止 CSRF 攻击

选择安全的前端框架

现在流行的前端框架都会内置 CSRF 防护。

使用 Anti-CSRF 令牌

令牌(也称为令牌同步模式)是一种服务器端的保护方式,服务器向用户的浏览器提供唯一的、随机生成的令牌,并检查每个请求来查看浏览器是否在执行请求之前将其发回。

这个令牌通过隐藏字段发送,应该是一个会在很短的时间内失效的不可预测的随机数,且不能重复使用。

根据不同页面的信息敏感程度,可以针对每个请求使用不同的令牌,或者仅针对不同的表单。令牌应该以安全的方式进行对比验证(例如比较哈希值),并且不应在 HTTP GET 请求中发送,防止作为 URL 的一部分或者 Referrer 泄漏。

大纲
文件