由于在 django 1.4.4 中引入了 ALLOWED_HOSTS 设置,我收到了很多 django 错误电子邮件到我的管理员地址,因为一些愚蠢的蜘蛛正在寻找易受攻击的 phpMyAdmin 安装或类似的东西。这些邮件是完全有效的,因为蜘蛛请求中的主机头确实是错误的,但我宁愿让 django 只在重要事情出错时给我发送错误邮件。有没有一种简单的方法可以使SuspiciousOperation
邮件静音,还是我必须一路走下去子类CommonMiddleware
?
6 回答
为了完整起见,您可以覆盖部分日志记录:(在 django 1.6 上测试):
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
},
'loggers': {
'django.security.DisallowedHost': {
'handlers': ['null'],
'propagate': False,
},
},
}
另请参阅Django 安全文档。
要禁止管理员电子邮件,请定义日志过滤器:
def skip_suspicious_operations(record):
if record.name == 'django.security.DisallowedHost':
return False
return True
然后在 settings.py 中将其添加到 LOGGING 字典中作为过滤器:
'filters': {
'skip_suspicious_operations': {
'()': 'django.utils.log.CallbackFilter',
'callback': skip_suspicious_operations,
}
}
并将过滤器添加到 mail_admins 处理程序:
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['skip_suspicious_operations'],
'include_html' : True,
}
}
这在 Django 1.6 中按原样工作。在 Django-1.5 中,我认为与 record.name 比较的 RHS 有点不同,但否则它应该可以工作。
阿帕奇
如果您使用的是 Apache,您可以从 httpd.conf 过滤掉到不同主机的流量——这是一个比编写任何代码更简单的解决方案。就像是
WSGIPythonPath [your Python path]
ServerSignature Off
ServerTokens Prod
<VirtualHost *:80>
DocumentRoot /var/www
</VirtualHost>
<VirtualHost *:80>
ServerName www.myrealhost.com
rest of apache configuration ....
</VirtualHost>
第一个设置将抓取与您的服务器名称不匹配的所有内容(例如 www.myrealhost.com )
Nginx
您可以在 nginx 中使用相同的方法使用server_name
指令过滤掉配置文件中不同主机的流量,例如
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
server_name www.myrealhost.com; # optionally include localhost here for local testing
...the rest of your nginx config for Django
}
server {
# You need to provide a default server for all other traffic
listen 80 default_server;
server_name _;
# If you need a healthcheck route that works with any hostname, unncomment
# the next three lines
l #location = /healthcheck {
# return 200;
#}
location / {
return 444;
}
}
稍微搜索一下就会发现 Django 的错误跟踪器中已经存在一个错误:
https://code.djangoproject.com/ticket/19866
在(希望)Django 1.5.1 中修复之前,有一个涉及日志过滤器的解决方法。
所以我通常更喜欢将所有不匹配的虚拟主机重定向到一个虚拟主机。这是通过对 apache.conf 文件的简单添加来完成的...
<VirtualHost *:80>
RedirectMatch ^/?(.*) http://www.example.com/$1
</VirtualHost>
上面的示例将导致对任何不匹配的虚拟主机的请求重定向到http://www.example.com,同时正确保留路径组件。
这还有一个额外的好处,那就是纠正用户遵循无效请求或类似情况的情况。
但是等等,有一个应用程序!