【问题标题】:Suppress admin email on django ALLOWED_HOSTS exception在 django ALLOWED_HOSTS 异常上禁止管理员电子邮件
【发布时间】:2013-03-01 07:48:03
【问题描述】:

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

【问题讨论】:

    标签: django


    【解决方案1】:

    阿帕奇

    如果您使用的是 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;
        }
     }
    

    【讨论】:

    • 也希望看到一个 nginx sn-p!
    • @rrauenza Done -- 很酷,6 年前的答案仍然适用。
    • 谢谢!我还发现(昨天正在这样做)您还需要一个仅返回 404 的默认服务器部分。
    • 是的——我使用我的默认部分来提供一个可与 AWS 负载均衡器一起使用的运行状况检查端点。
    【解决方案2】:

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

    【讨论】:

    • 很棒的答案,感谢您将我指向文档部分 - 工作就像一个魅力,出色的工作,谢谢您
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      但是等等,有一个应用程序可以做到这一点!

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

      【讨论】:

        【解决方案5】:

        要禁止管理员电子邮件,请定义日志过滤器:

        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 有点不同,但否则它应该可以工作。

        【讨论】:

        • 我认为您还需要一个 'loggers' 并在 LOGGING dict 中使用 'django.security' 的密钥才能真正捕获这些消息。
        • 为什么要检查record.name而不是isinstance(record,DisallowedHost)?
        【解决方案6】:

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

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

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

        【讨论】:

        • 该错误并没有解决发送可疑操作的电子邮件——它是关于发送“500”响应而不是“400”。它在 Django 1.6 中已修复,但仍会生成管理员电子邮件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 2021-11-11
        • 2013-12-06
        • 2012-11-08
        • 1970-01-01
        • 2019-08-12
        • 2013-09-30
        相关资源
        最近更新 更多