當從模板生成 HTML 時,始終有這樣的風險:變量包含影響已生成 HTML 的字符。有兩種 解決方法:手動轉義每個字符或默認自動轉義所有的東西。
Jinja 兩者都支持,使用哪個取決于應用的配置。默認的配置未開啟自動轉義有這樣幾個 原因:
* 轉義所有非安全值的東西也意味著 Jijna 轉義已知不包含 HTML 的值,比如數字,對 性能有巨大影響。
* 關于變量安全性的信息是易碎的。可能會發生強制標記一個值為安全或非安全的情況, 而返回值會被作為 HTML 轉義兩次。
### 使用手動轉義[](http://docs.jinkan.org/docs/jinja2/templates.html#id16 "Permalink to this headline")
如果啟用了手動轉義,按需轉義變量就是?**你的**?責任。要轉義什么?如果你有 一個?*可能*?包含?>?、??、?&?或?"?字符的變量,你必須轉義 它,除非變量中的 HTML 有可信的良好格式。轉義通過用管道傳遞到過濾器?|e?來實現:?{{?user.username|e?}}?。
### 使用自動轉義[](http://docs.jinkan.org/docs/jinja2/templates.html#id17 "Permalink to this headline")
當啟用了自動轉移,默認會轉移一切,除非值被顯式地標記為安全的。可以在應用中 標記,也可以在模板中使用?|safe?過濾器標記。這種方法的主要問題是 Python 本 身沒有被污染的值的概念,所以一個值是否安全的信息會丟失。如果這個信息丟失, 會繼續轉義,你最后會得到一個轉義了兩次的內容。
但雙重轉義很容易避免,只需要依賴 Jinja2 提供的工具而不使用諸如字符串模運算符 這樣的 Python 內置結構。
返回模板數據(宏、?super?、?self.BLOCKNAME?)的函數,其返回值總是被標記 為安全的。
模板中的字符串字面量在自動轉義中被也被視為是不安全的。這是因為安全的字符串是 一個對 Python 的擴展,而不是每個庫都能妥善地使用它。
- 介紹
- 預備知識
- 安裝
- 基本 API 使用
- 實驗性的 Python 3 支持
- API
- 基礎
- Unicode
- 高層 API
- 自動轉義
- 標識符的說明
- 未定義類型
- 上下文
- 加載器
- 字節碼緩存
- 實用工具
- 異常
- 自定義過濾器
- 求值上下文
- 自定義測試
- 全局命名空間
- 低層 API
- 元 API
- 沙箱
- API
- 運算符攔截
- 模板設計者文檔
- 概要
- 變量
- 過濾器
- 測試
- 注釋
- 空白控制
- 轉義
- 行語句
- 模板繼承
- HTML 轉義
- 控制結構清單
- 導入上下文行為
- 表達式
- 內置過濾器清單
- 內置測試清單
- 全局函數清單
- 擴展
- 自動轉義擴展
- 擴展
- 添加擴展
- i18n 擴展
- 表達式語句
- 循環控制
- With 語句
- 自動轉義擴展
- 編寫擴展
- 集成
- Babel 集成
- Pylons
- TextMate
- Vim
- 從其它的模板引擎切換
- Jinja1
- Django
- Mako
- 提示和技巧
- Null-Master 退回
- 交替的行
- 高亮活動菜單項
- 訪問父級循環