服务器IP地址是否应该在ALLOWED_HOSTS django设置中?

时间:2013-05-21 17:46:27

标签: django

自升级到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]'}

3 个答案:

答案 0 :(得分:20)

不,它不应该。

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

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

旧答案(INSECURE):

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

答案很长: 根据{{​​3}}:

  

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

换句话说:如果您的请求将您的服务器IP地址作为主机标头传递(显然它们确实如此),并且您认为没关系,那么您应该将服务器IP添加到ALLOWED_HOSTS。

,对于documentation many,IP地址可能在HTTP_HOST中,也有人可以直接询问IP地址。

答案 1 :(得分:12)

不,它不应该

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

这是Host header poisoning & ALLOWED_HOSTS上security.stackexchange.com上的帖子。

怎么做

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

如何

您最有可能在django前面使用nginx作为反向代理。如果您根本不使用任何反向代理(或者您正在使用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;
    }
}

答案 2 :(得分:10)

实际上,只需编辑文件import paramiko try: client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(IP, username=myusername,password=mypassword,timeout=3) except Exception as e: pass 并将主机IP(IP地址添加到您正在运行Django的计算机上)到列表MyProjectName/settings.py,默认情况下为空

所以,在你的情况下,我们会在改变之前得到:

ALLOWED_HOSTS

更改后:

...
ALLOWED_HOSTS = []
...

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

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

。现在,如果您转到浏览器并输入地址http://168.62.208.14:8000,您应该会在页面中找到自己的位置&#34;祝贺您第一个支持Django的页面&#34;。