Jinja2與Flask的HTML自動轉(zhuǎn)義

今天寫一個頁面的時候發(fā)現(xiàn)代碼竟然原封不動的出現(xiàn)了,懷疑是Jinja的自動轉(zhuǎn)義。結(jié)果發(fā)現(xiàn)Jinja2的Escaping是自動關(guān)閉的,下面是Jinja官方文檔中描述的,默認(rèn)自動轉(zhuǎn)義是關(guān)閉的,可以手動轉(zhuǎn)義或者開啟自動轉(zhuǎn)義。

HTML Escaping

When generating HTML from templates, there’s always a risk that a
variable will include characters that affect the resulting HTML. There
are two approaches: manually escaping each variable or automatically
escaping everything by default.

Jinja supports both, but what is used depends on the application
configuration. The default configuaration is no automatic escaping for
various reasons:

escaping everything except of safe values will also mean that Jinja is
escaping variables known to not include HTML such as numbers which is
a huge performance hit. The information about the safety of a variable
is very fragile. It could happen that by coercing safe and unsafe
values the return value is double escaped HTML.

轉(zhuǎn)而搜索發(fā)現(xiàn)是Flask的原因,F(xiàn)lask的自動轉(zhuǎn)義是默認(rèn)開啟的,如需要關(guān)閉需要以下操作(來自官方文檔):

自動轉(zhuǎn)義就是自動幫你將特殊的字符替換成轉(zhuǎn)義符號。HTML(或者XML, XHTML)的特殊字符有 &, >, <, “, ‘ 。因為這些字符在文檔中有它自己特殊的含義,所以如果你想在文章中使用這些符號,必須將它替換成轉(zhuǎn)義符號。如果不這樣做,不僅用戶使用不了這些符號,還會導(dǎo)致安全問題。(更多 :ref:xss)

但是有時候你需要在模版中禁用自動轉(zhuǎn)義。如果你想直接將HTML插入頁面,比如將markdown語言轉(zhuǎn)換成HTML,那么你就需要這樣做了。

有3種方法可以關(guān)閉自動轉(zhuǎn)義:

在Python文件中進(jìn)行轉(zhuǎn)義。先在 :class:~flask.Markup 對象中進(jìn)行轉(zhuǎn)義,然后將它傳送給模版。一般推薦使用這個方式。
在模版文件中進(jìn)行轉(zhuǎn)義。通過 |safe 過濾器來表示字符串是安全的,如{{ 變量名 | safe }}
暫時禁用全局的自動轉(zhuǎn)義功能。

要想在模版中禁用全局自動轉(zhuǎn)義功能,可以用 語句塊:

{\% codeblock lang:python \%}
{\% autoescaping false \%}
autoescaping is disableed here
{\% endautoescape \%}
{\% endcodeblock \%}

在這么做的時候,要語句塊中使用到的變量非常小心。

自動開始轉(zhuǎn)義也是不錯的,這方面的安全就可以少考慮了,關(guān)閉也很簡單。我直接使用第二種方式,在需要禁止轉(zhuǎn)義的部分加上safe標(biāo)記,很方便。其他的兩種目前還沒用上~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容