HTML 轉(zhuǎn)義

2018-02-24 15:39 更新

當(dāng)從模板生成 HTML 時,始終有這樣的風(fēng)險:變量包含影響已生成 HTML 的字符。有兩種 解決方法:手動轉(zhuǎn)義每個字符或默認(rèn)自動轉(zhuǎn)義所有的東西。

Jinja 兩者都支持,使用哪個取決于應(yīng)用的配置。默認(rèn)的配置未開啟自動轉(zhuǎn)義有這樣幾個 原因:

  • 轉(zhuǎn)義所有非安全值的東西也意味著 Jijna 轉(zhuǎn)義已知不包含 HTML 的值,比如數(shù)字,對 性能有巨大影響。
  • 關(guān)于變量安全性的信息是易碎的??赡軙l(fā)生強制標(biāo)記一個值為安全或非安全的情況, 而返回值會被作為 HTML 轉(zhuǎn)義兩次。

使用手動轉(zhuǎn)義

如果啟用了手動轉(zhuǎn)義,按需轉(zhuǎn)義變量就是?你的?責(zé)任。要轉(zhuǎn)義什么?如果你有 一個?可能?包含?>?、??、?&?或?"?字符的變量,你必須轉(zhuǎn)義 它,除非變量中的 HTML 有可信的良好格式。轉(zhuǎn)義通過用管道傳遞到過濾器?|e?來實現(xiàn):?{{?user.username|e?}}?。

使用自動轉(zhuǎn)義

當(dāng)啟用了自動轉(zhuǎn)移,默認(rèn)會轉(zhuǎn)移一切,除非值被顯式地標(biāo)記為安全的??梢栽趹?yīng)用中 標(biāo)記,也可以在模板中使用?|safe?過濾器標(biāo)記。這種方法的主要問題是 Python 本 身沒有被污染的值的概念,所以一個值是否安全的信息會丟失。如果這個信息丟失, 會繼續(xù)轉(zhuǎn)義,你最后會得到一個轉(zhuǎn)義了兩次的內(nèi)容。

但雙重轉(zhuǎn)義很容易避免,只需要依賴 Jinja2 提供的工具而不使用諸如字符串模運算符 這樣的 Python 內(nèi)置結(jié)構(gòu)。

返回模板數(shù)據(jù)(宏、?super?、?self.BLOCKNAME?)的函數(shù),其返回值總是被標(biāo)記 為安全的。

模板中的字符串字面量在自動轉(zhuǎn)義中被也被視為是不安全的。這是因為安全的字符串是 一個對 Python 的擴(kuò)展,而不是每個庫都能妥善地使用它。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號