CodeQL 文档

CSRF 防护减弱或禁用

ID: rb/csrf-protection-disabled
Kind: problem
Security severity: 8.8
Severity: warning
Precision: high
Tags:
   - security
   - external/cwe/cwe-352
Query suites:
   - ruby-code-scanning.qls
   - ruby-security-extended.qls
   - ruby-security-and-quality.qls

单击以在 CodeQL 存储库中查看查询

跨站请求伪造 (CSRF) 是一种漏洞,攻击者可以通过这种漏洞强制用户执行他们没有意图的操作。

攻击者欺骗经过身份验证的用户向 Web 应用程序提交请求。通常,此请求会导致服务器上的状态更改,例如更改用户的密码。当用户访问攻击者控制的网站时,可以发起此请求。如果 Web 应用程序仅依赖 Cookie 进行身份验证,或依赖自动包含在请求中的其他凭据,则此请求对服务器来说将是合法的。

CSRF 的常见防御措施是在从服务器发送到用户的 HTML 中生成一个唯一的令牌。此令牌可用作隐藏字段,与请求一起发送回服务器,服务器可以检查令牌是否有效以及是否与相关用户会话关联。

建议

在许多 Web 框架中,CSRF 防护默认情况下处于启用状态。在这种情况下,使用默认配置足以防御大多数 CSRF 攻击。

示例

以下示例显示了一种禁用 CSRF 防护的情况,方法是跳过令牌验证。

class UsersController < ApplicationController
  skip_before_action :verify_authenticity_token
end

可以通过删除对 skip_before_action 的调用来重新启用验证。

在使用 Rails 的 protect_from_forgery 方法防止 CSRF 时,应谨慎行事。此方法的默认行为是在提供无效的 CSRF 令牌时将会话置空。这可能不足以避免 CSRF 漏洞——例如,如果会话的一部分被记忆。调用 protect_from_forgery with: :exception 可以通过在无效的 CSRF 令牌上引发异常而不是置空会话来帮助避免这种情况。

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私