gpt4 book ai didi

Django 不会为 csrftoken cookie 设置 HttpOnly

转载 作者:行者123 更新时间:2023-12-02 06:56:45 25 4
gpt4 key购买 nike

在我的 Django 的 settings.py 中,我有

SESSION_COOKIE_HTTPONLY = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
X_FRAME_OPTIONS = 'DENY'
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 15768000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SESSION_COOKIE_AGE = 2 * 24 * 3600

但是https://detectify.com发现没有为 csrftoken cookie 设置此标志。我检查了 Chrome 关于 cookie 的信息,如果我理解正确的话,空的 HTTP 列确认这两个 cookie 不是仅 HTTP 的:enter image description here

此外,如果我在 Chrome 的控制台中执行 document.cookie ,则会显示 csrftoken 值。

我想知道为什么会出现这种情况。我在 uwsgi 和 nginx 上运行 Django。 nginx配置如下,问题站点为https://rodichi.net :

server {
listen 443 ssl http2 default_server;
server_name rodichi.net;

ssl_certificate /etc/letsencrypt/live/rodichi.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/rodichi.net/privkey.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
charset utf-8;

... # location settings follow here

```

最佳答案

您仅将其配置为将 CSRF token 设置为安全(即仅通过 https 请求发送),而不是 HttpOnly(即不可用于 Javascript)。

查看 Django 文档,您还需要设置 CSRF_COOKIE_HTTPONLY 。然而,文档正确地指出:

Designating the CSRF cookie as HttpOnly doesn’t offer any practical protection because CSRF is only to protect against cross-domain attacks. If an attacker can read the cookie via JavaScript, they’re already on the same domain as far as the browser knows, so they can do anything they like anyway. (XSS is a much bigger hole than CSRF.)

Although the setting offers little practical benefit, it’s sometimes required by security auditors.

这还取决于您如何实现 CSRF。表单基本上有两种方法:

  1. 为每个表单设置一个隐藏的 CSRF 字段,并让该字段在每次加载表单时生成唯一的值。因此,如果提交的表单包含有效的代码,那么您就知道该请求来自您的域。这在服务器端很复杂,因为它需要跟踪有效 token ,并且还意味着必须动态生成每个表单以包含随机 token ,但在客户端更容易,因为使用标准表单请求而不是 JavaScript。对于这种保护,不需要 CSRF cookie,即使存在也不会使用它。

  2. 另一种方法调用设置 CSRF cookie,并让 Javascript 读取该 cookie 并将其在 HTTP header (通常是 X-CSRF-TOKEN)中发送。来自另一个域的 CSRF 请求将无法访问此 CSRF cookie,因此无法正确设置 header 。由于 cookie 也会在所有请求中发送,因此服务器可以轻松检查 HTTP 请求中的 cookie 是否与请求中设置的 header 匹配。这意味着请求来自可以访问 cookie 的某个地方,这意味着它来自同一域。这意味着这不是 CSRF 攻击。这在服务器端更容易实现(因为不需要保留事件 token 列表),但需要前端使用 Javascript,并且需要 CSRF token 不是 HttpOnly - 正是因为 token 是应该由客户端 Javascript 读取!

再次是Django documentation warns against this :

If you enable this and need to send the value of the CSRF token with an AJAX request, your JavaScript must pull the value from a hidden CSRF token form input on the page instead of from the cookie.

因此,总而言之,建议为此 cookie 设置 HttpOnly 属性。它限制了您,没有增加真正的保护,并且使 cookie 本身毫无意义。

您将在您网站上的渗透测试报告中突出显示它(从外观上看,包括https://detectify.com),但您应该接受这一点,因为您认为这是正确的。不确定是否可以将此 cookie 列入白名单 https://detectify.com所以它不会每次都提醒?

关于Django 不会为 csrftoken cookie 设置 HttpOnly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44849451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com