CodeQL 文档

CSRF 防护未启用

ID: rb/csrf-protection-not-enabled
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 中生成唯一的令牌。此令牌可以用作隐藏字段,与发送回服务器的请求一起发送,服务器可以检查令牌是否有效,并与相关用户会话相关联。

建议

在 Rails Web 框架中,通过在 ActionController 类中添加对 protect_from_forgery 方法的调用来启用 CSRF 防护。通常这在 ApplicationController 类中完成,或在其他控制器类继承的等效类中完成。此方法的默认行为是在提供无效的 CSRF 令牌时清空会话。这可能不足以避免 CSRF 漏洞 - 例如,如果部分会话被记忆。调用 protect_from_forgery with: :exception 可以通过在无效的 CSRF 令牌上引发异常来避免这种情况。

示例

以下示例显示了在安全请求处理策略为 :exception 的情况下启用 CSRF 防护的情况。

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end
  

参考资料

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