关于jinja2的{{...|safe}}过滤器
原文:https://www.jianshu.com/p/deddb31ab9fe
沒有接觸過這門語言,不過像很多類似的例子可供參考,如果不對輸入過濾,又恰好滿足某些條件,是很有可能由于惡意輸入導致程序崩潰,甚至用戶信息流失的。
最簡單的例子是輸出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|length }}:將返回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|escape或content|e。
first(value):返回一個序列的第一個元素。示例:names|first
format(value,*arags,**kwargs):格式化字符串。比如:
{{ "%s" - "%s"|format('Hello?',"Foo!") }}
將輸出: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的{{...|safe}}过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jquery中的$(document).
- 下一篇: 【Python】部分基础+Flask/J