22

由于在 django 1.4.4 中引入了 ALLOWED_HOSTS 设置,我收到了很多 django 错误电子邮件到我的管理员地址,因为一些愚蠢的蜘蛛正在寻找易受攻击的 phpMyAdmin 安装或类似的东西。这些邮件是完全有效的,因为蜘蛛请求中的主机头确实是错误的,但我宁愿让 django 只在重要事情出错时给我发送错误邮件。有没有一种简单的方法可以使SuspiciousOperation邮件静音,还是我必须一路走下去子类CommonMiddleware

4

6 回答 6

38

为了完整起见,您可以覆盖部分日志记录:(在 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 安全文档

于 2014-08-04T07:54:52.843 回答
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 有点不同,但否则它应该可以工作。

于 2014-01-16T18:54:07.527 回答
4

阿帕奇

如果您使用的是 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;
    }
 }
于 2013-07-01T16:12:54.227 回答
1

稍微搜索一下就会发现 Django 的错误跟踪器中已经存在一个错误:

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

在(希望)Django 1.5.1 中修复之前,有一个涉及日志过滤器的解决方法。

于 2013-03-13T12:01:49.793 回答
0

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

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

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

这还有一个额外的好处,那就是纠正用户遵循无效请求或类似情况的情况。

于 2015-02-17T14:08:38.957 回答
0

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

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

于 2014-06-11T01:21:59.663 回答