跳至内容

网络应用程序安全指南/跨站点请求伪造 (CSRF)

来自维基教科书,开放的世界,开放的书籍

跨站点请求伪造 (CSRF)

如果第三方网站导致已登录用户的浏览器向您的服务发出请求,就会发生跨站点请求伪造。对于 GET 表单,这可以通过使用 IFRAME 或 IMG 标签来实现。对于 POST 表单,这可以通过使用表单元素来实现,该元素的 action 属性指向您的网站,可能使用 JavaScript 提交。这两种方法都不需要用户交互。浏览器会自动提交用户的会话 cookie。这可以允许攻击者以已登录用户的权限触发不需要的操作。

为防止这种类型的攻击

  • 包含一个隐藏的表单字段,该字段包含与用户会话绑定的随机令牌(最好是执行的操作),并在响应中检查此令牌
  • 确保令牌不可预测且攻击者无法获得
    • 不要将其包含在攻击者可以使用<script>标签加载到其网站中的文件中
  • Referer 检查不安全,但可以用作附加措施

基本原理

CSRF 攻击允许攻击者滥用现有用户会话。Web 浏览器的同源策略阻止攻击网站读取目标网站的内容(以及令牌)。由于令牌绑定到会话,因此攻击者无法通过简单地访问网站来获取令牌。令牌需要不可预测(安全随机性),否则攻击者只需猜测即可获得令牌。

Referer 检查不可靠,因为某些用户代理不发送该标头,而某些个人防火墙出于隐私原因过滤或伪造该标头。此外,攻击者可以避免发送 Referer,例如(在 IE8 和 Firefox 6 上测试)通过使用 JavaScript 设置 window.location。

华夏公益教科书