Djangoでクリックジャッキング対策
Django 1.5.1でstartprojectすると、クリックジャッキング対策のためのMiddlewareが用意されていることがわかります。
'django.middleware.clickjacking.XFrameOptionsMiddleware'ですね。コメントアウトされてますが。
たぶん1.4以降だと用意されてます。
MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', # Uncomment the next line for simple clickjacking protection: # 'django.middleware.clickjacking.XFrameOptionsMiddleware', )
このMiddlewareを有効にすると、デフォルトでレスポンスヘッダX-Frame-OptionsとしてSAMEORIGINを返すようになります。
X-Frame-Optionsの値はsettingsでカスタマイズできます。
settings.py
X_FRAME_OPTIONS = 'DENY'
X-Frame-Optionsの意味は以下の通り
X-Frame-Options HTTP レスポンスヘッダは、ブラウザがページを または
参考 : X-Frame-Options レスポンスヘッダ | MDN
DENYが設定されたレスポンスはframe内に描画されなくなります。
SAMEORIGINの場合は、同じホストであれば描画されるわけですね。
同じdjangoアプリ内の別のページをframe内に描画するサンプルを動かしてみた結果
SAMEORIGINであれば描画されますが
DENYにすると描画されなくなります。
主要なサイトを幾つか調べてみました
サイト | X-Frame-Options |
---|---|
http://www.facebook.com/ | DENY |
https://twitter.com/ | SAMEORIGIN |
https://plus.google.com/ | SAMEORIGIN |
https://www.google.co.jp/ | SAMEORIGIN |
http://b.hatena.ne.jp/ | なし |
http://mixi.jp/ | なし |
参考 : Clickjacking Protection | Django documentation | Django