43

自从升级到 django 1.5 后,我的日志显示了几个SuspiciousOperation带有文本的异常:

Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): <my server's ip>

这真的是一个“可疑”请求,还是ALLOWED_HOSTS除了我的域名之外,我是否应该始终在设置中包含我的服务器的 IP 地址?知道什么会发出请求HTTP_HOST = "ip address"而不是HTTP_HOST = "domain name"

这是请求环境:

{'HTTP_ACCEPT_ENCODING': "'identity'",
 'HTTP_CONNECTION': "'close'",
 'HTTP_HOST': "'168.62.208.14'",
 'HTTP_X_FORWARDED_PROTOCOL': "'https'",
 'HTTP_X_REAL_IP': "'176.10.35.241'",
 'HTTP_X_SCHEME': "'https'",
 'PATH_INFO': "u'/'",
 'QUERY_STRING': "''",
 'RAW_URI': "'/'",
 'REMOTE_ADDR': "'127.0.0.1'",
 'REMOTE_PORT': "'45068'",
 'REQUEST_METHOD': "'GET'",
 'SCRIPT_NAME': "u''",
 'SERVER_NAME': "'168.62.208.14'",
 'SERVER_PORT': "'80'",
 'SERVER_PROTOCOL': "'HTTP/1.0'",
 'SERVER_SOFTWARE': "'gunicorn/0.14.6'",
 'gunicorn.socket': "'<socket._socketobject object at 0x7ab3b40>'",
 'wsgi.errors': '"<open file \'<stderr>\', mode \'w\' at 0x7f0c94810270>"',
 'wsgi.file_wrapper': "'<class gunicorn.http.wsgi.FileWrapper at 0x34eec80>'",
 'wsgi.input': "'<gunicorn.http.body.Body object at 0x2a0bf10>'",
 'wsgi.multiprocess': 'False',
 'wsgi.multithread': 'False',
 'wsgi.run_once': 'False',
 'wsgi.url_scheme': "'http'",
 'wsgi.version': '[1, 0]'}
4

3 回答 3

25

不,不应该。

通常这不是配置 Django 服务器的安全方式。有时,例如,在测试您的应用程序时,您可以通过直接 IP 地址访问它,但没有理由禁用日志警告。

我的旧答案是错误的,感谢 Max Malysh 指出这一点。

旧答案(不安全):

简短的回答是:是(根据提供的标题)。

长答案:根据文档

如果 Host 标头(或 X-Forwarded-Host,如果启用了 USE_X_FORWARDED_HOST)与此列表中的任何值都不匹配,则 django.http.HttpRequest.get_host() 方法将引发 SuspiciousOperation。

换句话说:如果您的请求将您的服务器 ip 地址作为主机标头传递(显然他们这样做了),并且您认为没问题,那么是的,您应该将服务器 ip 添加到 ALLOWED_HOSTS。

此外,由于多种 原因,IP 地址可能在 HTTP_HOST 中,也有人可以直接询问 IP 地址。

于 2013-05-21T20:40:34.817 回答
25

不,不应该

默认情况下,没有理由将 IP 地址作为有效的 HOST 标头接受。此消息表明生产环境配置错误:此类请求不应到达后端。

这是 security.stackexchange.com 上有关主机标头中毒和 ALLOWED_HOSTS的帖子。

该怎么办

在到达 django 后端之前过滤掉所有带有无效 HOST 标头的请求。

如何

很可能您在nginxdjango 前面用作反向代理。如果您根本不使用任何反向代理(或者您正在使用runserver),则必须使用(否则您将面临安全风险)。

444在配置顶部添加一个默认服务器块返回。它应该是配置中的第一个服务器块:

# File: /etc/nginx/sites-available/domain.com

upstream django_server {
    server 127.0.0.1:8000;
}

# Catch all requests with an invalid HOST header
server {
    server_name "";
    listen      80;
    return      444;
}

# Your config goes there
server {
    server_name  domain.com;
    listen       80;

    location / {
        proxy_pass http://django_server;
    }
}
于 2017-08-04T00:21:33.683 回答
14

实际上,只需编辑文件MyProjectName/settings.py并将主机 IP(运行 Django 的机器的 IP 地址)添加到列表ALLOWED_HOSTS中,默认情况下为空。

因此,在您的情况下,我们将在更改之前:

...
ALLOWED_HOSTS = []
...

改动后:

...
ALLOWED_HOSTS = ['168.62.208.14'] #Make sure your host IP is a string
...

再次运行服务器,你应该会很好。以下是使用端口 8000 的示例:

python manage.py runserver 168.62.208.14:8000

. 现在,如果您进入浏览器并输入地址http://168.62.208.14:8000,您应该会在“恭喜您的第一个 Django 驱动的页面”页面中找到自己。

于 2017-01-28T05:57:23.577 回答