67

Django 1.7 alpha (Git からチェックアウト) を実行しているサイトをデプロイして以来、次のようなタイトルのエラー メッセージを受け取ることがあります。

「無効な HTTP_HOST ヘッダー: 'xxx.xxx.com'」

Host:これは、 HTTP ヘッダーが に記載されていないホスト名に設定されていることが原因であることがわかりましたALLOWED_HOSTS。ただし、誰かが偽のホスト名でサーバーにリクエストを送信するタイミングと頻度を制御することはできません. したがって、他の誰かが怪しいことをしようとしていることを知らせる大量のエラー メールは必要ありません。

このエラー メッセージを無効にする方法はありますか? プロジェクトのロギング設定は次のようになります。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}
4

13 に答える 13

63

このエラーを無視してはいけません。代わりに、Django バックエンドに到達する前にリクエストを拒否する必要があります。HOST使用できるセットのないリクエストを拒否するには

SetEnvIfNoCase Host .+ VALID_HOST
Order Deny,Allow
Deny from All
Allow from env=VALID_HOST

または、特定のドメイン (example.com) との一致を強制します

SetEnvIfNoCase Host example\.com VALID_HOST
Order Deny,Allow
Deny from All
Allow from env=VALID_HOST
于 2013-09-13T17:33:19.307 に答える
40

loggersこれをロギング構成のセクションに追加できます。

    'django.security.DisallowedHost': {
        'handlers': ['mail_admins'],
        'level': 'CRITICAL',
        'propagate': False,
    },

これにより、ロギングのしきい値が、が検出されERRORたときに Django が使用するレベルよりも高く設定されます。SuspiciousOperation

または、たとえば aFileHandlerを使用して、これらのイベントを電子メールで送信せずにログに記録することもできます。たとえば、これらの特定のイベント専用のファイルを使用するには、これをhandlersセクションに追加できます。

    'spoof_logfile': {
        'level': 'ERROR',
        'class': 'logging.FileHandler',
        'filename': '/path/to/spoofed_requests.log',
    },

次に、これをloggersセクションで使用します。

    'django.security.DisallowedHost': {
        'handlers': ['spoof_logfile'],
        'level': 'ERROR',
        'propagate': False,
    },

Django docsで行われた提案に注意してください。

    'django.security.DisallowedHost': {
        'handlers': ['null'],
        'propagate': False,
    },

Python 2.7 以降を実行しているかどうかに依存します - 2.6 ではloggingNullHandler.

于 2013-09-13T16:50:49.413 に答える
9

これは、django がゴミのリクエストを受け取らないようにする NGINX の例です。

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl default_server;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    return 444;
}


server {
    listen 80;
    # This will keep Django from receiving request with invalid host
    server_name <SERVER_IP> your.domain.com;
    ...
于 2015-02-27T11:04:28.980 に答える
8

その特定の SuspiciousOperation を次のようなもので沈黙させることができます

'loggers': {
    'django.security.DisallowedHost': {
        'handlers': ['null'],
        'propagate': False,
   },

詳細については、これを参照してください https://docs.djangoproject.com/en/dev/topics/logging/#django-security

編集

「null」ハンドラも追加する必要があります。

'handlers': {
    'null': {
        'level': 'DEBUG',
        'class': 'logging.NullHandler',
    },
}

おそらく、これを追加してエラーのレベルを変更するだけで済みます (DEBUG を 'ERROR' に置き換えます)。

完全な構文とセマンティックについては、常にドキュメントを参照してください。

于 2013-08-13T22:55:18.763 に答える
4

まだコメントできませんが、Order Deny, Allow は非推奨であるため、現在の Require ディレクティブを使用して仮想ホストでこれを行う方法は次のとおりです。

<Directory /var/www/html/>
    SetEnvIfNoCase Host example\.com VALID_HOST
    Require env VALID_HOST
    Options
</Directory>
于 2016-10-04T22:17:29.220 に答える