読者です 読者をやめる 読者になる 読者になる

Django 1.8で追加されたSecurityMiddlewareについて

Django1.8で増えた機能でSecurityMiddlewareというものがあります。
何ができるのか把握しておきたかったので調べていました。
django.middleware.security.SecurityMiddleware
コードはこのあたり。
django/security.py at stable/1.8.x · django/django · GitHub
以下の内容は、Django1.8のドキュメントとコードを元に記述しています。

概要

SecurityMiddlewareは、Djangoアプリケーションへのリクエスト、レスポンスに対していくつかのセキュリティ強化を施します。
具体的には以下のような機能があります。

  • HTTP Strict Transport Security (HSTS) ヘッダの付与
  • X-Content-Type-Options: nosniff ヘッダの付与
  • X-XSS-Protection: 1; mode=block ヘッダの付与
  • HTTPSスキームのURLへのリダイレクト機能

各機能は独立して有効、無効を設定できるようになっています。

HTTP Strict Transport Securityヘッダの付与

settings.SECURE_HSTS_SECONDSに秒数を設定すると、リクエストがHTTPSの場合に「strict-transport-security」ヘッダがレスポンスに付与されます。この際、max-ageはSECURE_HSTS_SECONDSの値になります。
settings.SECURE_HSTS_INCLUDE_SUBDOMAINSにTrueを設定すると、ヘッダの最後に「includeSubDomains」を追加で付与します。

X-Content-Type-Options: nosniff ヘッダの付与

settings.SECURE_CONTENT_TYPE_NOSNIFFにTrueを設定すると、「x-content-type-options: nosniff」ヘッダがレスポンスに付与されます。

X-XSS-Protection: 1; mode=block ヘッダの付与

settings.SECURE_BROWSER_XSS_FILTERにTrueを設定すると、「x-xss-protection: 1; mode=block」ヘッダがレスポンスに付与されます。

HTTPSスキームのURLへのリダイレクト機能

settings.SECURE_SSL_REDIRECTにTrueを設定すると、HTTPでDjangoアプリケーションにアクセスした際に、httpsで始まるURLにリダイレクトするようにレスポンスを返します。
この際、ホスト名を変更したい場合はsettings.SECURE_SSL_HOSTにホスト名を指定できます。
また、特定のパスにアクセスした場合にリダイレクトさせたくない場合は、settings.SECURE_REDIRECT_EXEMPTに正規表現で除外するパターンを指定できます。