自升级到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]'}
答案 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;。