防止jinja2自動轉義,以將數據庫中的html片段插入到所在html中(以html輸出,而非HTML代碼輸出)

本文轉載自http://tieba.baidu.com/p/4074015134,感謝原作者!

首先,Jinja2是一個模板引擎。如果連模板引擎是什麼都不知道的話就請不要看了。本文僅供需要的人研究(以及閒的要命的人)。。

摘要:Jinjia默認自動轉義HTML,safe過濾器可以取消這個功能

Jinja2(下面用jinjia代替)是Flask的默認模板引擎,在普通HTML基礎上增加了一堆函數和功能方便後端和前端交換數據(比方說怎樣將數據庫的內容扔進HTML?每次都生成一個新的HTML文件?有了Jinjia,一切都方便多了~)

現在,我使用我的comment網站做例子。這是我的網站,功能是大家可以添加任意的comment。文本會存儲在一個sqlite3的數據庫,然後會在主頁展示:
這裏寫圖片描述

現在,讓我們來模擬添加一個comment。這個comment使用了<strong>HTML標籤,我們來看看效果。像這樣:
這裏寫圖片描述

看,我們的文字並沒有被加粗!這是爲什麼呢?我們可以從Flask文檔中的一部分得到解答:

模板繼承讓模板用起來相當順手。如欲瞭解繼承的工作機理,請跳轉到 模板繼承 模式的文檔。最起碼,模板繼承能使特定元素 (比如頁眉、導航欄和頁腳)可以出現在所有的頁面。

自動轉義功能默認是開啓的,所以如果 name 包含 HTML ,它將會被自動轉義。如果你能信任一個變量,並且你知道它是安全的(例如一個模塊把 Wiki 標記轉換爲 HTML),你可以用 Markup 類或 |safe 過濾器在模板中把它標記爲安全的。在 Jinja 2 文檔中,你會看到更多的例子。

這裏寫圖片描述

因此,根據文檔我們可以得知,如果想讓HTML不會被轉義,我們需要啓用safe過濾器。現在讓我們回到網頁源碼,來研究下究竟是怎麼回事:

這裏寫圖片描述

我們可以看到文本被直接的顯示出來了。包含在雙大括號內的文本意味着變量,這些變量就是數據庫內的文本。我們不需要關心這些,現在讓我們對body使用safe過濾器:

這裏寫圖片描述

成功!現在我們在body的標籤被應用了,文本呈現出了粗體。然而因爲我們沒有對title啓用safe過濾器,所以title並沒有被加粗。

這裏寫圖片描述

safe意味着禁用全部轉義。這同時意味着我們可以使用全部的HTML標籤。在一個博客等網站啓用safe過濾器可以讓博客更加絢麗多彩:

這裏寫圖片描述

這裏寫圖片描述

好了,本次科普就到這裏。雖然啓用safe過濾器可以讓文章更加絢麗多彩,但是如果用戶不被信任的話將是特別危險的,請記住:“永遠不要相信用戶的輸入”,另外還包括用戶的HTTP Header、Cookie、用戶名、驗證碼、密碼、標點符號、空格、空行、表情、時間和日期……

有關怎樣啓用部分HTML標籤、驗證用戶的輸入是否危險等,請參閱Flask和Jinjia2文檔。
本文章遵守CC-BY-NC-ND協議。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章