ミドルウェア
このドキュメントでは、Djangoに付属するすべてのミドルウェアコンポーネントについて説明します。 それらの使用方法と独自のミドルウェアの作成方法については、ミドルウェア使用ガイドを参照してください。
利用可能なミドルウェア
キャッシュミドルウェア
- class UpdateCacheMiddleware
- class FetchFromCacheMiddleware
サイト全体のキャッシュを有効にします。 これらが有効になっている場合、:setting: `CACHE_MIDDLEWARE_SECONDS` 設定で定義されている限り、Djangoを利用した各ページがキャッシュされます。 キャッシュドキュメントを参照してください。
「一般的な」ミドルウェア
- class CommonMiddleware
完璧主義者のためのいくつかの便利さを追加します:
:setting: `DISALLOWED_USER_AGENTS` 設定でユーザーエージェントへのアクセスを禁止します。これはコンパイルされた正規表現オブジェクトのリストである必要があります。
:setting: `APPEND_SLASH` および:setting:` PREPEND_WWW` の設定に基づいてURLの書き換えを実行します。
:setting: `APPEND_SLASH` が
True
で、最初のURLがスラッシュで終わっておらず、URLconfに見つからない場合は、次のURLを追加して新しいURLを作成します。最後にスラッシュします。 この新しいURLがURLconfで見つかった場合、Djangoはリクエストをこの新しいURLにリダイレクトします。 それ以外の場合、初期URLは通常どおり処理されます。たとえば、
foo.com/bar
の有効なURLパターンがないが、がの有効なパターンを持っている場合、foo.com/bar
はfoo.com/bar/
にリダイレクトされます。 X148X] 。:setting: `PREPEND_WWW` が
True
の場合、先頭に「www」がないURL。 先頭に「www」が付いた同じURLにリダイレクトされます。これらのオプションは両方とも、URLを正規化することを目的としています。 哲学は、各URLが1つの場所にのみ存在する必要があるということです。 技術的には、URL
foo.com/bar
はfoo.com/bar/
とは異なります。検索エンジンインデクサーはそれらを個別のURLとして扱うため、URLを正規化することをお勧めします。非ストリーミング応答の
Content-Length
ヘッダーを設定します。
- CommonMiddleware.response_redirect_class
デフォルトは HttpResponsePermanentRedirect です。 CommonMiddleware
をサブクラス化し、属性をオーバーライドして、ミドルウェアによって発行されるリダイレクトをカスタマイズします。
- class BrokenLinkEmailsMiddleware
- リンク切れ通知メールを:setting: `MANAGERS` に送信します(エラー報告を参照)。
GZipミドルウェア
- class GZipMiddleware
警告
セキュリティ研究者は最近、圧縮技術(GZipMiddleware
を含む)がWebサイトで使用されると、サイトが多くの攻撃の可能性にさらされる可能性があることを明らかにしました。 サイトでGZipMiddleware
を使用する前に、これらの攻撃を受けているかどうかを慎重に検討する必要があります。 影響を受けているかどうかについて任意のに疑問がある場合は、GZipMiddleware
の使用を避ける必要があります。 詳細については、 BREACHペーパー(PDF)および breakattack.com を参照してください。
django.middleware.gzip.GZipMiddleware
は、GZip圧縮を理解するブラウザー(すべての最新ブラウザー)のコンテンツを圧縮します。
このミドルウェアは、応答本文の読み取りまたは書き込みが必要な他のミドルウェアの前に配置して、後で圧縮が行われるようにする必要があります。
次のいずれかに該当する場合、コンテンツは圧縮されません。
- コンテンツ本体の長さは200バイト未満です。
- 応答はすでに
Content-Encoding
ヘッダーを設定しています。 - リクエスト(ブラウザ)は、
gzip
を含むAccept-Encoding
ヘッダーを送信していません。
応答にETag
ヘッダーがある場合、ETagは RFC 7232#section-2.1 に準拠するように弱くなります。
gzip_page()デコレータを使用して、個々のビューにGZip圧縮を適用できます。
条件付きGETミドルウェア
- class ConditionalGetMiddleware
条件付きGET操作を処理します。 応答にETag
ヘッダーがない場合、ミドルウェアは必要に応じてヘッダーを追加します。 応答にETag
またはLast-Modified
ヘッダーがあり、要求にIf-None-Match
またはIf-Modified-Since
がある場合、応答は HttpResponseNotModified に置き換えられます。 ]。
ロケールミドルウェア
- class LocaleMiddleware
リクエストからのデータに基づいて言語を選択できるようにします。 ユーザーごとにコンテンツをカスタマイズします。 国際化ドキュメントを参照してください。
- LocaleMiddleware.response_redirect_class
デフォルトは HttpResponseRedirect です。 LocaleMiddleware
をサブクラス化し、属性をオーバーライドして、ミドルウェアによって発行されるリダイレクトをカスタマイズします。
セキュリティミドルウェア
警告
展開状況が許せば、通常、フロントエンドWebサーバーにSecurityMiddleware
によって提供される機能を実行させることをお勧めします。 そうすれば、Djangoによって処理されないリクエスト(静的メディアやユーザーがアップロードしたファイルなど)がある場合、それらはDjangoアプリケーションへのリクエストと同じ保護を受けます。
- class SecurityMiddleware
django.middleware.security.SecurityMiddleware
は、要求/応答サイクルにいくつかのセキュリティ強化を提供します。 それぞれを個別に有効または無効にすることができます。
- :setting: `SECURE_BROWSER_XSS_FILTER`
- :setting: `SECURE_CONTENT_TYPE_NOSNIFF`
- :setting: `SECURE_HSTS_INCLUDE_SUBDOMAINS`
- :setting: `SECURE_HSTS_PRELOAD`
- :setting: `SECURE_HSTS_SECONDS`
- :setting: `SECURE_REDIRECT_EXEMPT`
- :setting: `SECURE_REFERRER_POLICY`
- :setting: `SECURE_SSL_HOST`
- :setting: `SECURE_SSL_REDIRECT`
HTTP Strict TransportSecurity
HTTPS経由でのみアクセスする必要があるサイトの場合、「Strict-Transport-Security」ヘッダー[を設定することにより、安全でない接続を介したドメイン名への接続を(一定期間)拒否するように最新のブラウザーに指示できます。 X234X]。 これにより、SSLストリッピング中間者(MITM)攻撃への露出が減少します。
SecurityMiddleware
はすべてのHTTPS応答でこのヘッダーを設定します。
HSTSを有効にするときは、最初に小さな値をテストに使用することをお勧めします。たとえば、 :setting: `SECURE_HSTS_SECONDS = 3600 ` 1時間。 WebブラウザがサイトからHSTSヘッダーを認識するたびに、指定された期間、ドメインとの安全でない通信(HTTPを使用)を拒否します。 すべてのアセットがサイトで安全に提供されていることを確認したら(つまり、 HSTSは何も壊しませんでした)、この値を増やして、まれな訪問者を保護することをお勧めします(31536000秒、つまり 1年が一般的です)。
さらに、:setting: `SECURE_HSTS_INCLUDE_SUBDOMAINS` 設定をTrue
に設定すると、SecurityMiddleware
はincludeSubDomains
ディレクティブをStrict-Transport-Security
に追加します]ヘッダー。 これをお勧めします(すべてのサブドメインがHTTPSのみを使用して提供されていると仮定します)。そうしないと、サブドメインへの安全でない接続を介してサイトが脆弱になる可能性があります。
サイトをブラウザプリロードリストに送信する場合は、:setting: `SECURE_HSTS_PRELOAD` 設定をTrue
に設定します。 これにより、preload
ディレクティブがStrict-Transport-Security
ヘッダーに追加されます。
警告
HSTSポリシーは、ヘッダーを設定した応答のURLだけでなく、ドメイン全体に適用されます。 したがって、ドメイン全体がHTTPS経由でのみ提供される場合にのみ使用する必要があります。
HSTSヘッダーを適切に尊重するブラウザは、ユーザーが警告をバイパスして、期限切れ、自己署名、またはその他の方法で無効なSSL証明書を使用してサイトに接続することを拒否します。 HSTSを使用する場合は、証明書の状態が良好であることを確認し、そのままにしてください。
ノート
ロードバランサーまたはリバースプロキシサーバーの背後にデプロイされていて、Strict-Transport-Security
ヘッダーが応答に追加されていない場合は、Djangoが安全な接続上にあることを認識していないことが原因である可能性があります。 :setting: `SECURE_PROXY_SSL_HEADER` 設定が必要になる場合があります。
リファラーポリシー
バージョン3.0の新機能。
ブラウザは、ユーザーがどのようにしてそこに到達したかに関する情報をサイトに送信する方法として、リファラーヘッダーを使用します。 ユーザーがリンクをクリックすると、ブラウザはリンクページの完全なURLをリファラーとして送信します。 これは、サイトにリンクしているユーザーを特定するなどの目的には役立ちますが、ユーザーが別のサイトにアクセスしていることを1つのサイトに通知することで、プライバシーの問題を引き起こす可能性もあります。
一部のブラウザには、ユーザーがリンクをクリックしたときにHTTP Referer
ヘッダーを送信する必要があるかどうかに関するヒントを受け入れる機能があります。 このヒントは、リファラーポリシーヘッダーを介して提供されます。 このヘッダーは、ブラウザーに対して次の3つの動作のいずれかを示唆する可能性があります。
- 完全なURL:
Referer
ヘッダーでURL全体を送信します。 たとえば、ユーザーがhttps://example.com/page.html
にアクセスしている場合、Referer
ヘッダーには"https://example.com/page.html%22
が含まれます。 - オリジンのみ:リファラーの「オリジン」のみを送信します。 オリジンは、スキーム、ホスト、および(オプションで)ポート番号で構成されます。 たとえば、ユーザーが
https://example.com/page.html
にアクセスしている場合、発信元はhttps://example.com/
になります。 - リファラーなし:
Referer
ヘッダーをまったく送信しません。
このヘッダーがブラウザに注意するように指示できる条件には、次の2種類があります。
- 同一生成元とクロスオリジン:
https://example.com/1.html
からhttps://example.com/2.html
へのリンクは同一生成元です。https://example.com/page.html
からhttps://not.example.com/page.html
へのリンクはクロスオリジンです。 - プロトコルのダウングレード:リンクを含むページがHTTPS経由で提供されているが、リンク先のページがHTTPS経由で提供されていない場合、ダウングレードが発生します。
警告
サイトがHTTPS経由で提供されている場合、 DjangoのCSRF保護システムではReferer
ヘッダーが存在する必要があるため、Referer
ヘッダーを完全に無効にするとCSRF保護が妨げられます。 CSRF保護を維持しながら、Referer
ヘッダーを無効にすることの利点のほとんどを得るには、同一生成元のリファラーのみを有効にすることを検討してください。
SecurityMiddleware
は、:setting: `SECURE_REFERRER_POLICY` 設定に基づいて、Referrer-Policy
ヘッダーを設定できます(スペルに注意:ブラウザーはReferer
ヘッダーを送信します)ユーザーがリンクをクリックしたが、ブラウザにクリックするかどうかを指示するヘッダーのスペルがReferrer-Policy
)の場合。 この設定の有効な値は次のとおりです。
no-referrer
- このサイトでクリックされたリンクのリファラーを送信しないようにブラウザーに指示します。
no-referrer-when-downgrade
- プロトコルのダウングレードが発生しない場合にのみ、リファラーとして完全なURLを送信するようにブラウザーに指示します。
origin
- 完全なURLではなく、オリジンのみをリファラーとして送信するようにブラウザーに指示します。
origin-when-cross-origin
- 同じオリジンリンクのリファラーとして完全なURLを送信し、クロスオリジンリンクのオリジンのみを送信するようにブラウザーに指示します。
same-origin
- 完全なURLを送信するようにブラウザに指示しますが、同じオリジンのリンクに対してのみです。 クロスオリジンリンクのリファラーは送信されません。
strict-origin
- 完全なURLではなくオリジンのみを送信し、プロトコルのダウングレードが発生したときにリファラーを送信しないようにブラウザーに指示します。
strict-origin-when-cross-origin
- リンクが同一生成元であり、プロトコルのダウングレードが発生しない場合に、完全なURLを送信するようにブラウザに指示します。 リンクがクロスオリジンであり、プロトコルのダウングレードが発生しない場合は、オリジンのみを送信します。 プロトコルのダウングレードが発生した場合、リファラーはありません。
unsafe-url
- 常に完全なURLをリファラーとして送信するようにブラウザーに指示します。
不明なポリシー値
ポリシー値がユーザーエージェントによって不明である場合、フォールバックを提供するために複数のポリシー値を指定することができます。 理解された最後に指定された値が優先されます。 これをサポートするために、反復可能またはコンマ区切りの文字列を:setting: `SECURE_REFERRER_POLICY` で使用できます。
X-Content-Type-Options: nosniff
一部のブラウザは、Content-Type
ヘッダーを上書きして、フェッチするアセットのコンテンツタイプを推測しようとします。 これは、サーバーが不適切に構成されたサイトを表示するのに役立ちますが、セキュリティリスクをもたらす可能性もあります。
サイトがユーザーがアップロードしたファイルを提供している場合、悪意のあるユーザーが特別に細工したファイルをアップロードする可能性があります。このファイルは、無害であると予想されたときに、ブラウザーによってHTMLまたはJavaScriptとして解釈されます。
ブラウザがコンテンツタイプを推測せず、常にContent-Type
ヘッダーで提供されるタイプを使用するように強制するには、 X-Content-Type-Options:nosniff ヘッダーを渡すことができます。 SecurityMiddleware
は、:setting: `SECURE_CONTENT_TYPE_NOSNIFF` 設定がTrue
の場合、すべての応答に対してこれを実行します。
Djangoがユーザーがアップロードしたファイルの提供に関与していないほとんどのデプロイメント状況では、この設定は役に立ちません。 たとえば、:setting: `MEDIA_URL` がフロントエンドWebサーバー(nginx、Apacheなど)から直接提供される場合は、このヘッダーをそこに設定する必要があります。 一方、Djangoを使用してファイルをダウンロードするために認証を要求するなどの操作を行っていて、Webサーバーを使用してヘッダーを設定できない場合は、この設定が役立ちます。
X-XSS-Protection: 1; mode=block
一部のブラウザには、 XSS攻撃のように見えるコンテンツをブロックする機能があります。 これらは、ページのGETまたはPOSTパラメーターでJavaScriptコンテンツを探すことによって機能します。 サーバーの応答でJavaScriptが再生されると、ページのレンダリングがブロックされ、代わりにエラーページが表示されます。
X-XSS-Protectionヘッダーは、XSSフィルターの動作を制御するために使用されます。
ブラウザでXSSフィルタを有効にし、疑わしいXSS攻撃を常にブロックするように強制するには、X-XSS-Protection: 1; mode=block
ヘッダーを渡すことができます。 SecurityMiddleware
は、:setting: `SECURE_BROWSER_XSS_FILTER` 設定がTrue
の場合、すべての応答に対してこれを実行します。
警告
ブラウザーのXSSフィルターは有用な防御手段ですが、排他的に依存してはなりません。 すべてのXSS攻撃を検出できるわけではなく、すべてのブラウザがヘッダーをサポートしているわけではありません。 XSS攻撃を防ぐために、すべての入力を検証およびサニタイズしていることを確認してください。
SSLリダイレクト
サイトがHTTP接続とHTTPS接続の両方を提供している場合、ほとんどのユーザーはデフォルトでセキュリティで保護されていない接続になります。 最高のセキュリティを得るには、すべてのHTTP接続をHTTPSにリダイレクトする必要があります。
:setting: `SECURE_SSL_REDIRECT` 設定をTrueに設定すると、SecurityMiddleware
はすべてのHTTP接続を永続的に(HTTP 301)HTTPSにリダイレクトします。
ノート
パフォーマンス上の理由から、これらのリダイレクトはDjangoの外部、フロントエンドロードバランサーまたは nginx などのリバースプロキシサーバーで実行することをお勧めします。 :setting: `SECURE_SSL_REDIRECT` は、これがオプションではない展開状況を対象としています。
:setting: `SECURE_SSL_HOST` 設定に値がある場合、すべてのリダイレクトは、最初に要求されたホストではなく、そのホストに送信されます。
HTTP経由で利用可能で、HTTPSにリダイレクトされないページがサイトにいくつかある場合は、:setting: `SECURE_REDIRECT_EXEMPT` 設定でそれらのURLに一致する正規表現を一覧表示できます。
ノート
ロードバランサーまたはリバースプロキシサーバーの背後にデプロイされていて、Djangoがリクエストが実際にすでに安全であるかどうかわからない場合は、:setting: `SECURE_PROXY_SSL_HEADER` 設定を設定する必要があります。
サイトミドルウェア
- class CurrentSiteMiddleware
現在のサイトを表すsite
属性をすべての着信HttpRequest
オブジェクトに追加します。 サイトのドキュメントを参照してください。
認証ミドルウェア
- class AuthenticationMiddleware
現在ログインしているユーザーを表すuser
属性を、すべての着信HttpRequest
オブジェクトに追加します。 Webリクエストでの認証を参照してください。
- class RemoteUserMiddleware
Webサーバーが提供する認証を利用するためのミドルウェア。 使用方法の詳細については、 REMOTE_USER を使用した認証を参照してください。
- class PersistentRemoteUserMiddleware
Webサーバーを利用するためのミドルウェアは、ログインページでのみ有効になっている場合に認証を提供します。 使用方法の詳細については、ログインページでのみREMOTE_USERを使用するを参照してください。
CSRF保護ミドルウェア
- class CsrfViewMiddleware
POSTフォームに非表示のフォームフィールドを追加し、リクエストの正しい値を確認することで、クロスサイトリクエストフォージェリに対する保護を追加します。 クロスサイトリクエストフォージェリ保護のドキュメントを参照してください。
ミドルウェアの注文
さまざまなDjangoミドルウェアクラスの順序に関するヒントを次に示します。
-
SSLリダイレクトをオンにする場合は、他の不要なミドルウェアが大量に実行されるのを防ぐため、リストの一番上に表示されます。
-
Vary
ヘッダー(SessionMiddleware
、GZipMiddleware
、LocaleMiddleware
)を変更するものの前。 -
応答本文を変更または使用する可能性のあるミドルウェアの前。
UpdateCacheMiddleware
の後:Vary
ヘッダーを変更します。 -
:setting: `CSRF_USE_SESSIONS` を使用している場合、エラービュー( PermissionDenied など)をトリガーする例外を発生させる可能性のあるミドルウェアの前。
UpdateCacheMiddleware
の後:Vary
ヘッダーを変更します。 -
応答を変更する可能性のあるミドルウェアの前(
ETag
ヘッダーを設定します)。GZipMiddleware
の後、gzip圧縮されたコンテンツのETag
ヘッダーは計算されません。 -
SessionMiddleware
(セッションデータを使用)およびUpdateCacheMiddleware
(Vary
ヘッダーを変更)の後の最上位の1つ。 -
応答を変更する可能性のあるミドルウェアの前(
Content-Length
ヘッダーを設定します)。CommonMiddleware
の前に表示され、応答を変更するミドルウェアは、Content-Length
をリセットする必要があります。上部に近い::setting: `APPEND_SLASH` または:setting:` PREPEND_WWW` が
True
に設定されている場合にリダイレクトされます。SessionMiddleware
の後、:setting: `CSRF_USE_SESSIONS` を使用している場合。 -
CSRF攻撃が処理されたと想定するミドルウェアを表示する前。
RemoteUserMiddleware 、またはログインを実行する可能性のあるその他の認証ミドルウェアの前。したがって、ミドルウェアチェーンを呼び出す前に、CSRFトークンをローテーションします。
SessionMiddleware
の後、:setting: `CSRF_USE_SESSIONS` を使用している場合。 -
SessionMiddleware
の後:セッションストレージを使用します。 -
SessionMiddleware
の後:セッションベースのストレージを使用できます。 -
Vary
ヘッダーを変更するミドルウェアの後:そのヘッダーは、キャッシュハッシュキーの値を選択するために使用されます。 -
これはラストリゾートタイプのミドルウェアであるため、下部近くにある必要があります。
-
これはラストリゾートタイプのミドルウェアであるため、下部近くにある必要があります。