保护您的 cookie
在settings.py 中放置行
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
Cookie 将仅通过 HTTPS 连接发送。此外,您可能还想要SESSION_EXPIRE_AT_BROWSER_CLOSE=True
. 请注意,如果您使用的是旧版本的 django(低于 1.4),则没有安全 CSRF cookie 的设置。作为一个快速修复,当会话 cookie 是安全的 ( SESSION_COOKIE_SECURE=True
) 时,您可以让 CSRF cookie 是安全的,通过编辑 django/middleware/csrf.py
:
class CsrfViewMiddleware(object):
...
def process_response(self, request, response):
...
response.set_cookie(settings.CSRF_COOKIE_NAME,
request.META["CSRF_COOKIE"], max_age = 60 * 60 * 24 * 7 * 52,
domain=settings.CSRF_COOKIE_DOMAIN,
secure=settings.SESSION_COOKIE_SECURE or None)
将 HTTP 请求定向到 Web 服务器中的 HTTPS
接下来,您需要一个将 http 请求重定向到 https 的重写规则,例如,在 nginx 中
server {
listen 80;
rewrite ^(.*) https://$host$1 permanent;
}
Django的reverse
function和url模板标签只返回相对链接;因此,如果您在 https 页面上,您的链接将使您留在 https 网站上。
将操作系统环境变量 HTTPS 设置为 on
最后,(我的原始回复排除了这一点),您需要启用 OS 环境变量HTTPS
,'on'
以便 django 将 https 附加到完全生成的链接(例如,与HttpRedirectRequest
s 一样)。如果您使用的是 mod_wsgi,则可以添加以下行:
os.environ['HTTPS'] = "on"
到你的wsgi 脚本。如果您使用的是 uwsgi,则可以通过命令行开关--env HTTPS=on
或将行添加env = HTTPS=on
到 uwsgi.ini
文件来添加环境变量。作为最后的手段,如果没有其他方法,您可以编辑您的设置文件以包含行import os
和os.environ['HTTPS'] = "on"
,这也应该可以工作。
如果您使用的是 wsgi,您可能还需要将环境变量添加wsgi.url_scheme
到'https'
您的settings.py
:
os.environ['wsgi.url_scheme'] = 'https'
wsgi 建议由Vijayendra Bapte 的评论提供。
您可以通过阅读来了解对这个环境变量的需求django/http/__init__.py
:
def build_absolute_uri(self, location=None):
"""
Builds an absolute URI from the location and the variables available in
this request. If no location is specified, the absolute URI is built on
``request.get_full_path()``.
"""
if not location:
location = self.get_full_path()
if not absolute_http_url_re.match(location):
current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http',
self.get_host(), self.path)
location = urljoin(current_uri, location)
return iri_to_uri(location)
def is_secure(self):
return os.environ.get("HTTPS") == "on"
其他 Web 服务器事物:
听从那个人的建议,通过在 nginx 中添加一行来打开 Web 服务器中的 HSTS 标头:
add_header Strict-Transport-Security max-age=31536000;
这会告诉您的 Web 浏览器,您的网站在未来 10 年内将仅使用 HTTPS。如果将来从同一浏览器访问任何中间人攻击(例如,您登录咖啡店中的恶意路由器,将您重定向到页面的 HTTP 版本),您的浏览器会记住它应该只是 HTTPS,并防止您无意中放弃您的信息。但是请注意这一点,您不能改变主意,然后决定您的部分域将通过 HTTP 提供服务(直到您删除此行后的 10 年)。所以提前计划;例如,如果您认为您的应用程序可能很快就会流行起来,并且您需要在一个不能以您可以承受的价格很好地处理 HTTPS 的大型 CDN 上,您可能会遇到问题。
还要确保禁用弱协议。将您的域提交给SSL 测试以检查潜在问题(密钥太短、未使用 TLSv1.2、使用损坏的协议等)。例如,在 nginx 中我使用:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";