關於jinja2的 safe 過濾器

2021-09-27 13:30:39 字數 2372 閱讀 3628

原文:

沒有接觸過這門語言,不過像很多類似的例子可供參考,如果不對輸入過濾,又恰好滿足某些條件,是很有可能由於惡意輸入導致程式崩潰,甚至使用者資訊流失的。

最簡單的例子是輸出html,如果對於某些特殊符號不做轉移,很容易就會被惡意指令碼攻擊了。

我猜想這門語言應該對於特定條件下的輸入有自動的過濾(an environment with automatic escaping enabled),如果你標記為safe將會將這些過濾器移除掉,降低安全性,所以如果是對外的api,它們的輸入的話,沒有充足的理由,不應該標記為safe。

jinja2是模板引擎,我現在就是在學用它來做html模板。我之前的想法是這樣的:不轉義的話不就當做普通的字串了麼,反而應該是安全的。現在看了您的回答,又搜尋了一下,是否是這個意思:html中不轉義,它也未必會把輸入當成普通字串,實際上有可能當做js指令。html的轉義是將標籤等元素對映為對應的其他字元,實現一種過濾,從而避免執行一些使用者輸入的js**。

jinja2預設也開啟了轉義

不帶safe的,將內容原樣輸出

帶safe的,是將內容當做html進行解析。

如果乙個內容讓使用者輸入的,乙個懂程式的使用者惡意寫入乙個死迴圈框的js**,然後你還認為這個safe是安全的,網頁直接廢掉了。

所以一般我們傳遞給前段模板的,才有可能使用safe,如果是使用者輸入的內容,進行顯示時肯定不會使用safe,直接原樣輸出。

拓展閱讀:jinja模板的過濾器

過濾器是通過|符號進行使用的,例如:}:將返回name的長度。

jinja2擁有許多過濾器:

abs(value):返回乙個數值的絕對值。示例:-1|abs

default(value,default_value,boolean=false):如果當前變數沒有值,則會使用引數中的值來代替。

示例:name|default('xiaotuo')

——如果name不存在,則會使用xiaotuo來替代。boolean=false預設是在只有這個變數為undefined的時候才會使用default中的值,如果想使用python的形式判斷是否為false,則可以傳遞boolean=true。也可以使用or來替換。

escape(value)或e:轉義字元,會將等符號轉義成html中的符號。示例:content|escapecontent|e

first(value):返回乙個序列的第乙個元素。示例:names|first

format(value,*arags,**kwargs):格式化字串。比如:

}

將輸出:helloo? - foo!

last(value):返回乙個序列的最後乙個元素。示例:names|last

length(value):返回乙個序列或者字典的長度。示例:names|length

join(value,d=u''):將乙個序列用d這個引數的值拼接成字串。

safe(value):如果開啟了全域性轉義,那麼safe過濾器會將變數關掉轉義。示例:content_html|safe

int(value):將值轉換為int型別。

float(value):將值轉換為float型別。

lower(value):將字串轉換為小寫。

upper(value):將字串轉換為小寫。

replace(value,old,new): 替換將old替換為new的字串。

truncate(value,length=255,killwords=false):擷取length長度的字串。

striptags(value):刪除字串中所有的html標籤,如果出現多個空格,將替換成乙個空格。

trim:擷取字串前面和後面的空白字元。

string(value):將變數轉換成字串。

wordcount(s):計算乙個長字串中單詞的個數。

jinja2變數過濾器

django和flask框架中都使用了jinja2模板引擎來渲染模板,通過後端向模板中傳遞變數,通過過濾器可以修改這些變數,過濾器新增在變數名之後,中間使用豎線分割。例如 把值的首字母轉換為大寫,其他字母轉換為小寫 下表列出jinjia2部分的常用過濾器 過濾器說明 safe 渲染時不轉義 capi...

Jinja2語法小記

jinja2模板中文文件 表示式 用於裝載字串 變數 函式呼叫等語句 用於裝載控制語句,比如if判斷 for迴圈等注釋 用於裝載乙個注釋,模板渲染的時候會被忽略掉 在模板中,我們可以使用 獲取變數的屬性 user 如果user為傳入模板中的字典變數,則我們可通過 獲取它的鍵值。eg user.use...

Jinja 2模板引擎

flask 提供了jiaja 2模板引擎渲染模板,下面逐步介紹其模板渲染機制。index.html lang en charset utf 8 這是首頁中文字 title 這是首頁中文字 h1 head body html user.html lang en charset utf 8 這是使用者中...