クリックジャッキング対策¶
クリックジャッキングミドルウェアとデコレータは、 clickjacking 攻撃に対する防御を簡単に使える形で提供します。このタイプの攻撃は、悪意のあるサイトがユーザをだまし、隠された frame や iframe にロードした別サイトの要素をクリックさせることで起こります。
クリックジャッキングの例¶
Suppose an online store has a page where a logged-in user can click "Buy Now" to purchase an item. A user has chosen to stay logged into the store all the time for convenience. An attacker site might create an "I Like Ponies" button on one of their own pages, and load the store's page in a transparent iframe such that the "Buy Now" button is invisibly overlaid on the "I Like Ponies" button. If the user visits the attacker's site, clicking "I Like Ponies" will cause an inadvertent click on the "Buy Now" button and an unknowing purchase of the item.
クリックジャッキングを防止する¶
モダンブラウザでは、frame や iframe の中にあるリソースをロードして良いかどうかを示す X-Frame-Options HTTP ヘッダの指定を尊重します。もしサーバからのレスポンスに SAMEORIGIN
という値を指定した X-Frame-Options ヘッダが含まれていた場合、ブラウザは frame 中のリソースが同一サイトに由来する場合に限り、そのリソースをロードします。もしヘッダが DENY
に設定されていた場合、どのサイトがリクエスト元であろうとブラウザは frame 中のリソースのロードを問答無用でブロックします。
Django はこのヘッダをレスポンスに含めるための方法をいくつか提供します:
すべてのレスポンスにこのヘッダを設定するミドルウェア
そのミドルウェアの動作をオーバーライドする、または単純に特定のビューにだけこのヘッダを設定するデコレータのセット
X-Frame-Options
HTTP ヘッダは、まだそれがレスポンス中に存在しない場合に、ミドルウェアまたはビューのデコレータでのみ設定されます。
使用方法¶
X-Frame-Options をすべてのレスポンスに設定する¶
サイト内のすべてのレスポンスに対して同じ X-Frame-Options
値を設定するには、'django.middleware.clickjacking.XFrameOptionsMiddleware'
を MIDDLEWARE
に追加します:
MIDDLEWARE = [
...,
"django.middleware.clickjacking.XFrameOptionsMiddleware",
...,
]
このミドルウェアは、startproject
が生成する設定ファイルでは最初から有効化されています。
デフォルトでは、このミドルウェアはすべての HttpResponse
の X-Frame-Options
ヘッダを DENY
に設定します。もし他の値にしたい場合は X_FRAME_OPTIONS
を次のように設定します:
X_FRAME_OPTIONS = "SAMEORIGIN"
このミドルウェアを使うにあたって、いくつかのビューでは X-Frame-Options
ヘッダを 設定したくない かもしれません。そのような場合にはヘッダを設定しないよう、ビューデコレータでミドルウェアに指示できます:
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def ok_to_load_in_a_frame(request):
return HttpResponse("This page is safe to load in a frame on any site.")
注釈
フレームやiframe内でフォームを送信したり、セッションクッキーにアクセスしたい場合は、 CSRF_COOKIE_SAMESITE
や SESSION_COOKIE_SAMESITE
の設定を変更する必要があるかもしれません。
Setting X-Frame-Options
をビューごとに設定する¶
X-Frame-Options
ヘッダをビューごとに設定するために、Django は次のようなデコレータを提供しています:
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_deny
from django.views.decorators.clickjacking import xframe_options_sameorigin
@xframe_options_deny
def view_one(request):
return HttpResponse("I won't display in any frame!")
@xframe_options_sameorigin
def view_two(request):
return HttpResponse("Display in a frame if it's from the same origin as me.")
なお、これらのデコレータはミドルウェアとともに使うことができます。 デコレータの指定は、ミドルウェアの指定よりも優先されます。
制限事項¶
X-Frame-Options
ヘッダーは、モダンブラウザ においてのみクリックジャッキングに対する保護を提供します。