# 點擊劫持保護 #
點擊劫持中間件和裝飾器提供了簡捷易用的,對[點擊劫持](http://en.wikipedia.org/wiki/Clickjacking)的保護。這種攻擊在惡意站點誘導用戶點擊另一個站點的被覆蓋元素時出現,另一個站點已經加載到了隱藏的`frame`或`iframe`中。
## 點擊劫持的示例 ##
假設一個在線商店擁有一個頁面,已登錄的用戶可以點擊“現在購買”來購買一個商品。用戶為了方便,可以選擇一直保持商店的登錄狀態。一個攻擊者的站點可能在他們自己的頁面上會創建一個“我喜歡Ponies”的按鈕,并且在一個透明的`iframe`中加載商店的頁面,把“現在購買”的按鈕隱藏起來覆蓋在“我喜歡Ponies”上。如果用戶訪問了攻擊者的站點,點擊“我喜歡Ponies”按鈕會觸發對“現在購買”按鈕的無意識的點擊,不知不覺中購買了商品。
## 點擊劫持的防御 ##
現代瀏覽器遵循[X-Frame-Options](https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header)協議頭,它表明一個資源是否允許加載到`frame`或者`iframe`中。如果響應包含值為`SAMEORIGIN`的協議頭,瀏覽器會在`frame`中只加載同源請求的的資源。如果協議頭設置為`DENY`,瀏覽器會在加載`frame`時屏蔽所有資源,無論請求來自于哪個站點。
Django提供了一些簡單的方法來在你站點的響應中包含這個協議頭:
+ 一個簡單的中間件,在所有響應中設置協議頭。
+ 一系列的視圖裝飾器,可以用于覆蓋中間件,或者只用于設置指定視圖的協議頭。
## 如何使用 ##
### 為所有響應設置X-Frame-Options ###
要為你站點中所有的響應設置相同的`X-Frame-Options`值,將`'django.middleware.clickjacking.XFrameOptionsMiddleware'`設置為 `MIDDLEWARE_CLASSES`:
```
MIDDLEWARE_CLASSES = (
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
)
```
這個中間件可以在startproject生成的設置文件中開啟。
通常,這個中間件會為任何開放的`HttpResponse`設置`X-Frame-Options`協議頭為`SAMEORIGIN`。如果你想用 `DENY`來替代它,要設置`X_FRAME_OPTIONS`:
```
X_FRAME_OPTIONS = 'DENY'
```
使用這個中間件時可能會有一些視圖,你并不想為它設置`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.")
```
### 為每個視圖設置 X-Frame-Options ###
Django提供了以下裝飾器來為每個基礎視圖設置`X-Frame-Options`協議頭。
```
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`協議頭只在現代瀏覽器中保護點擊劫持。老式的瀏覽器會忽視這個協議頭,并且需要 [其它點擊劫持防范技巧](http://en.wikipedia.org/wiki/Clickjacking#Prevention)。
### 支持 X-Frame-Options 的瀏覽器 ###
+ Internet Explorer 8+
+ Firefox 3.6.9+
+ Opera 10.5+
+ Safari 4+
+ Chrome 4.1+
### 另見 ###
瀏覽器對`X-Frame-Options`支持情況的[完整列表](https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header#Browser_compatibility)。
> 譯者:[Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html),原文:[Clickjacking protection](https://docs.djangoproject.com/en/1.8/ref/clickjacking/)。
>
> 本文以 [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/) 協議發布,轉載請保留作者署名和文章出處。
>
> [Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html)人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第1部分:模型
- 第2部分:管理站點
- 第3部分:視圖和模板
- 第4部分:表單和通用視圖
- 第5部分:測試
- 第6部分:靜態文件
- 高級教程
- 如何編寫可重用的應用
- 為Django編寫首個補丁
- 模型層
- 模型
- 模型語法
- 元選項
- 模型類
- 查詢集
- 執行查詢
- 查找表達式
- 模型的實例
- 實例方法
- 訪問關聯對象
- 遷移
- 模式編輯器
- 編寫遷移
- 高級
- 管理器
- 原始的SQL查詢
- 聚合
- 多數據庫
- 自定義查找
- 條件表達式
- 數據庫函數
- 其它
- 遺留的數據庫
- 提供初始數據
- 優化數據庫訪問
- 視圖層
- 基礎
- URL配置
- 視圖函數
- 快捷函數
- 裝飾器
- 參考
- 內建的視圖
- TemplateResponse 對象
- 文件上傳
- 概覽
- File 對象
- 儲存API
- 管理文件
- 自定義存儲
- 基于類的視圖
- 概覽
- 內建顯示視圖
- 內建編輯視圖
- API參考
- 分類索引
- 高級
- 生成 CSV
- 生成 PDF
- 中間件
- 概覽
- 內建的中間件類
- 模板層
- 基礎
- 面向設計師
- 語言概覽
- 人性化
- 面向程序員
- 表單
- 基礎
- 概覽
- 表單API
- 內建的Widget
- 高級
- 整合媒體
- 開發過程
- 設置
- 概覽
- 應用程序
- 異常
- 概覽
- django-admin 和 manage.py
- 添加自定義的命令
- 測試
- 介紹
- 部署
- 概述
- WSGI服務器
- 部署靜態文件
- 通過email追蹤代碼錯誤
- Admin
- 管理操作
- 管理文檔生成器
- 安全
- 安全概述
- 說明Django中的安全問題
- 點擊劫持保護
- 加密簽名
- 國際化和本地化
- 概述
- 本地化WEB UI格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架