クリックジャッキング保護
クリックジャッキングミドルウェアとデコレータは、クリックジャッキングに対する使いやすい保護を提供します。 このタイプの攻撃は、悪意のあるサイトがユーザーをだまして、非表示のフレームまたはiframeにロードした別のサイトの隠された要素をクリックさせた場合に発生します。
クリックジャッキングの例
ログインしたユーザーが「今すぐ購入」をクリックしてアイテムを購入できるページがオンラインストアにあるとします。 ユーザーは、便宜上、常にストアにログインしたままにすることを選択しました。 攻撃者のサイトは、自分のページの1つに「ILike Ponies」ボタンを作成し、ストアのページを透明なiframeにロードして、「BuyNow」ボタンが「ILikePonies」ボタンに見えないようにオーバーレイされるようにする可能性があります。 ユーザーが攻撃者のサイトにアクセスした場合、「I Like Ponies」をクリックすると、「今すぐ購入」ボタンが誤ってクリックされ、知らないうちにアイテムが購入されます。
クリックジャッキングの防止
最新のブラウザは、リソースがフレームまたはiframe内でロードできるかどうかを示す X-Frame-Options HTTPヘッダーを尊重します。 応答にSAMEORIGIN
の値のヘッダーが含まれている場合、ブラウザーは、要求が同じサイトから発信された場合にのみ、フレーム内のリソースをロードします。 ヘッダーがDENY
に設定されている場合、ブラウザーは、どのサイトがリクエストを行ったかに関係なく、リソースがフレームに読み込まれないようにブロックします。
Djangoは、サイトからの応答にこのヘッダーを含めるいくつかの方法を提供します。
- すべての応答でヘッダーを設定するミドルウェア。
- ミドルウェアをオーバーライドしたり、特定のビューのヘッダーのみを設定したりするために使用できるビューデコレータのセット。
X-Frame-Options
HTTPヘッダーは、応答にまだ存在しない場合にのみ、ミドルウェアまたはビューデコレータによって設定されます。
それを使用する方法
すべての応答にX-Frame-Optionsを設定する
サイト内のすべての応答に同じX-Frame-Options
値を設定するには、'django.middleware.clickjacking.XFrameOptionsMiddleware'
を:setting: `MIDDLEWARE` :に設定します。
MIDDLEWARE = [
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
このミドルウェアは、:djadmin: `startproject` によって生成された設定ファイルで有効になります。
デフォルトでは、ミドルウェアはすべての発信HttpResponse
に対してX-Frame-Options
ヘッダーをDENY
に設定します。 代わりに、このヘッダーに他の値が必要な場合は、:setting: `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内のセッションCookieにアクセスしたりする場合は、:setting: `CSRF_COOKIE_SAMESITE` または:setting:` SESSION_COOKIE_SAMESITE` の設定を変更する必要があります。 。
ビューごとに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
ヘッダーは、最新のブラウザーでのクリックジャッキングからのみ保護します。 古いブラウザは静かにヘッダーを無視し、他のクリックジャッキング防止技術を必要とします。
X-Frame-Optionsをサポートするブラウザ
- Internet Explorer8以降
- 角
- Firefox 3.6.9+
- Opera 10.5+
- Safari 4+
- Chrome4.1以降