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
跨站请求伪造 (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 令牌上引发异常而不是置空会话来帮助避免这种情况。
参考¶
维基百科:跨站请求伪造
OWASP:跨站请求伪造
保护 Rails 应用程序:跨站请求伪造 (CSRF)
Veracode:当 Rails 的 protect_from_forgery 失败时.
常见漏洞枚举:CWE-352.