CodeQL 文档

CSRF 防护减弱或禁用

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

点击查看 CodeQL 代码库中的查询

跨站点请求伪造 (CSRF) 是一种漏洞,攻击者可以通过它迫使用户执行他们不想执行的操作。

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

针对 CSRF 的常见对策是在服务器向用户发送的 HTML 中生成一个唯一的令牌。此令牌可用作隐藏字段,与发送回服务器的请求一起发送,服务器随后可以检查令牌是否有效并与相关用户会话关联。

建议

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

示例

以下示例显示了一种情况下,通过覆盖默认中间件堆栈并省略保护 CSRF 的中间件来禁用 CSRF 防护。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

保护中间件可能在测试阶段被注释掉,因为服务器端令牌生成尚未设置。只需将其注释回来即可启用 CSRF 防护。

参考

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