django 1.4.4 で ALLOWED_HOSTS 設定が導入されて以来、脆弱な phpMyAdmin インストールなどを探している愚かなスパイダーによって引き起こされた例外について、管理者アドレスに多くの django エラー メールを受け取ります。スパイダーのリクエストのホストヘッダーが実際に間違っているため、これらのメールは完全に有効ですが、重要な問題が発生した場合にのみ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 dict にフィルターとして追加します。
'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 が少し異なると思いますが、それ以外は機能するはずです。
少しグーグルで調べてみると、Django のバグ トラッカーに既にバグがあることがわかりました。
https://code.djangoproject.com/ticket/19866
(できれば) Django 1.5.1 で修正されるまでは、ログ フィルターを使用する回避策があります。
したがって、私は通常、一致しないすべての vhost を単一の vhost にリダイレクトすることを好みます。これは、apache.conf ファイルに簡単に追加することで実行できます...
<VirtualHost *:80>
RedirectMatch ^/?(.*) http://www.example.com/$1
</VirtualHost>
上記の例では、パス コンポーネントを適切に保持しながら、一致しない vhost にhttp://www.example.comにリダイレクトするように要求します。
これには、ユーザーが無効なリクエストやそのようなものに従っている場合を修正するという追加の利点もあります。