2015-09-26 56 views
4

閱讀文檔時,mark_safe()似乎仍然神話之後。我想這與CSRF的東西有關。但是爲什麼以及何時應該使用mark_safe()?爲什麼以及何時使用Django mark_safe()函數

這裏是文檔

mark_safe(S)[來源]¶

顯式標記爲安全的(HTML) 輸出目的的字符串。返回的對象可以在字符串 或unicode對象適用的任何地方使用。

能在一個字符串多次調用。

爲了構建HTML的片段,您通常應該使用 django.utils.html.format_html()來代替。

串標安全的,如果修改將再次變得不安全。例如:

+0

當你能信任的內容。即,它不是由用戶提交的HTML。 –

+0

該文檔沒有提到CSRF,所以我不知道爲什麼你會認爲它與它有關。 –

回答

7

Django是一個框架,它試圖在默認情況下做「正確」的事情。這意味着當你做最簡單的事時,你可以做正確的事情。

現在讓我們來看看一些模板在PHP和Python:

PHP:

<? echo $foo ?> 

可以給:

<script src="evil"> 

Django的:

{{ foo }} 

給出與相同的輸入:

&gt;script src="evil"&lt; 

現在假設,您要放置鏈接<a href="link">text</a>。然後django會再次使用&lt;&gt;作爲文本呈現它。如果你知道你在做什麼,你現在可以使用mark_safe,表明文本是可信的(即不是從userinput推出)。

通常你會在你的模板中使用{{ foo|safe }}{% autoescape off %}{{ foo }}{% endautoescape %}作爲django程序員,當字符串被聲明爲安全時,這更清晰。

所以,在使用mark_safe?當您編寫自己的模板標籤或過濾器時,您需要將該標記字符串標記爲安全,因爲開發人員會認爲{{foo | mylinkifyfunction}}執行正確的操作(即它會跳過url foo,但不會逃脫url周圍的<a href=""></a>)。

+0

因此,mark_safe是要正確呈現<&gt;等? – day

+0

mark_safe通過python代碼告訴django模板應該按原樣使用字符串。通常情況下,這不是你想要的。這是[示例](https://github.com/django/django/blob/222d0633010e2f37f9fbd2d0559ecc4a5643c738/django/template/defaultfilters。py#L481)python代碼應該輸出''
''爲模板,它不會被轉義。 – allo

相關問題