【问题标题】:logout not working, caching on nginx, how to allow logout?注销不起作用,在 nginx 上缓存,如何允许注销?
【发布时间】:2018-06-08 00:32:32
【问题描述】:

我已经缓存了所有内容,如果我登录了我的帐户,您将无法再退出)退出后如何退出?我需要知道如何删除 cookie 和会话!我什么时候登出!

附:如果我在 nginx 级别禁用缓存,一切正常, nginx中的问题

nginx 配置

    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    proxy_connect_timeout 5;
    proxy_send_timeout 10;
    proxy_read_timeout 10;
    proxy_buffering on;
    proxy_buffer_size 16k;
    proxy_buffers 24 16k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;

    proxy_temp_path /tmp/nginx/proxy_temp;
    add_header X-Cache-Status $upstream_cache_status;
    proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=first_zone:100m;
    proxy_cache one;
    proxy_cache_valid any 30d;
    proxy_cache_key $scheme$proxy_host$request_uri$cookie_US;

服务器配置

upstream some site {
  server unix:/webapps/some/run/gunicorn.sock fail_timeout=0;
}

server {
    listen   80;
    server_name server name;
    expires 7d;
    client_max_body_size 4G;

    access_log /webapps/some/logs/nginx-access.log;
    error_log /webapps/some/logs/nginx-error.log;
    error_log /webapps/some/logs/nginx-crit-error.log crit;
    error_log /webapps/some/logs/nginx-debug.log debug; 
    location /static/ {
        alias   /webapps/some/static/;
    }

    location /media/ {
        alias   /webapps/some/media/;
    }
    location ~* ^(?!/media).*.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
        root root_path;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        access_log off;
    }    
    location ~* ^(?!/static).*.(?:css|js|html)$ {
        root root_path;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        access_log off;
    }     

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_cache one;
        proxy_cache_min_uses 1;
        proxy_cache_use_stale error timeout;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # proxy_set_header X-Forwarded-Proto https;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://some;
            break;
        }
    }
    error_page 404 /404.html;
    location = /error_404.html {
        root /webapps/some/src/templates;
    }

    error_page  500 502 503 504 /500.html;
    location = /error_500.html {
        root /webapps/some/src/templates;
    }
}

【问题讨论】:

    标签: django caching nginx


    【解决方案1】:

    不要使用GET 请求注销,而是将注销视图更改为接受POST 表单。

    POST 请求不应被缓存。

    这具有额外的安全优势,可以防止用户使用 iframe 或恶意链接注销(即:https://example.com/logout/,假设您没有禁用 django 的 CSRF 保护)。

    注意:有一个ticket on django's bug tracker related to this issue

    【讨论】:

      【解决方案2】:

      您有以下问题:

      我需要知道如何删除 cookie 和会话!我什么时候登出!

      使用以下代码:

      proxy_cache_key $scheme$proxy_host$request_uri$cookie_US;
      

      我们首先要知道$cookie_US里面有什么?

      • 如果只是登录名,那么您需要了解任何知道登录名并设置自己的 cookie 的人,并且知道该用户的隐藏资源的完整 URL(并且仅这样的用户)可以访问并且最近访问过(因此是新缓存的),现在可以获得对给定资源的“未经授权”访问,因为它将直接从缓存中提供,并且可能没有任何形式的重新验证.

      基本上,为了缓存用户特定的内容,您必须确保将http://nginx.org/r/proxy_cache_key 设置为表示一个实际秘密的不可猜测值,然后可以在用户退出时将其清除。随后,如果用户确实注销了,那么您的缓存仍然会受到任何仍然以某种方式仍然具有这种秘密值的人的重放攻击,但是通常会通过缓存的短到期时间来最小化,另外,秘密仍然是即使在注销后也应该保密。

      清除会话就像简单地将变量重新设置为不会授予用户访问权限的东西一样简单,例如,您甚至可以完全在 nginx 中实现整个注销:

      proxy_cache_key $scheme$proxy_host$request_uri$cookie_US;
      location /logout {
          add_header Set-Cookie "US=empty; Expires=Tue, 19-Jan-2038 03:14:07 GMT; Path=/";
          return 200 "You've been logged out!";
      }
      

      附:请注意,从技术上讲,上面的代码会使您面临 XSS 攻击——任何其他页面都可以简单地在您的网站上嵌入带有/logoutiframe,并且您的用户将被注销。理想情况下,you might want to use a confirmation of logout, or check $http_referer to ensure the link is clicked from your own site

      【讨论】:

        猜你喜欢
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        • 2017-01-07
        • 2012-06-19
        • 2018-06-09
        • 2012-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多