在django ALLOWED_HOSTS异常上禁止管理员电子邮件

时间:2013-03-13 11:38:50

标签: django

自从django 1.4.4中引入ALLOWED_HOSTS设置以来,我收到了很多关于django错误的电子邮件到我的管理员地址,因为一些愚蠢的蜘蛛寻找易受攻击的phpMyAdmin安装或其他一些例外。这些邮件是完全有效的,因为蜘蛛请求中的主机头确实是错误的,但我宁愿让django在重要的事情出错时只向我发送错误邮件。是否有一种简单的方法可以使SuspiciousOperation邮件静音,或者我是否必须一直进行CommonMiddleware的子类化?

6 个答案:

答案 0 :(得分:29)

为了完整性,您可以覆盖部分日志记录:(在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 security docs

答案 1 :(得分:6)

要取消管理员电子邮件,请定义日志记录过滤器:

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有点不同,但除此之外它应该有效。

答案 2 :(得分:3)

如果你正在使用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)

答案 3 :(得分:1)

有点谷歌搜索会发现Django的bug追踪器中已经存在一个错误:

https://code.djangoproject.com/ticket/19866

直到(希望)Django 1.5.1中有一个修复,有一个workaround涉及一个日志过滤器。

答案 4 :(得分:0)

但是等等,有一个应用程序!

https://github.com/litchfield/django-safelogging

答案 5 :(得分:0)

所以我通常更喜欢将所有不匹配的虚拟主机重定向到单个虚拟主机。这是通过添加apache.conf文件...

完成的
<VirtualHost *:80>
    RedirectMatch ^/?(.*) http://www.example.com/$1
</VirtualHost>

上面的示例将导致请求任何不匹配的vhost重定向到http://www.example.com,同时保留路径组件。

这还有一个额外的好处,就是纠正用户跟踪无效请求或某些此类事情的情况。