Django-自動HTML轉義
一、自動HTML轉義
從模板生成HTML時,總會有變量包含影響最終HTML的字符風險,例如,考慮這個模板的片段:
Hello, {{ name }}
起初,這是一種顯示用戶名的無害方式,但考慮用戶輸入他們的名字時,輸入:
<script>alert(‘123‘)</script>
使用該名稱值的時候,模板在顯示的時候:
Hello, <script>alert(‘hello‘)</script>
這意味著瀏覽器會彈出一個JavaScript警告框!
顯然,用戶提交的數據不應該盲目地被信任,並且直接插入到您的網頁中,因為惡意用戶可能會使用這種漏洞來做可能不好的事情。
為了避免這個問題,你有兩個選擇:
- 一,你可以確保通過
escape
過濾器運行每個不受信任的變量 (如下文檔所述),將可能有害的HTML字符轉換為無害的字符。這是在Django的最初幾年默認的解決方案,但問題是,它把責任推給你,開發者/模板作者,以確保您逃避一切。忘記逃離數據很容易。 - 二,你可以利用Django的自動HTML轉義。
默認情況下,在Django中,每個模板都會自動轉義每個變量標簽的輸出。具體來說,這五個字符是逃脫的:
<
轉換為<
>
轉換為>
‘
(單引號)轉換為'
"
(雙引號)轉換為"
&
轉換為&
我們再次強調,這種行為默認是開啟的。如果您使用的是Django的模板系統,那麽您將受到保護。
二、如何關閉它
如果您不希望數據被自動轉義,請在每個站點,每個模板級別或每個變量級別上進行自動轉義,您可以通過多種方式將其關閉。
你為什麽要關閉它?因為有時候,模板變量會包含您打算以原始HTML呈現的數據,在這種情況下,您不希望其內容被轉義。例如,您可能會在您的數據庫中存儲一塊HTML,並希望將其直接嵌入到您的模板中。或者,您可能正在使用Django的模板系統來生成不是 HTML的文本- 比如電子郵件。
對於個體變量
要禁用單個變量的自動轉義,請使用safe
過濾器:
This will be escaped: {{ data }} This will not be escaped: {{ data|safe }}
認為安全是避免進一步轉義的安全手段,或者可以安全地解釋為HTML。在這個例子中,如果data
包含‘<b>‘
,輸出將是:
This will be escaped: <b> This will not be escaped: <b>
對於模板塊
要控制模板的自動轉義,請將模板(或模板的特定部分)包裝到autoescape
標記中,如下所示:
{% autoescape off %}
Hello {{ name }}
{% endautoescape %}
該autoescape
標簽采用兩種on
或off
作為其參數。有時,您可能需要強制自動轉義,否則會被禁用。這是一個示例模板:
Auto-escaping is on by default. Hello {{ name }} {% autoescape off %} This will not be auto-escaped: {{ data }}. Nor this: {{ other_data }} {% autoescape on %} Auto-escaping applies again: {{ name }} {% endautoescape %} {% endautoescape %}
自動轉義標簽將其效果傳遞到擴展當前include
標簽的模板以及通過標簽包含的模板,就像所有塊標簽一樣。
由於在基本模板中關閉了自動轉義,因此它也將在子模板中關閉,導致在greeting
變量包含字符串時呈現以下呈現的HTML <b>Hello!</b>
:
<h1>This & that</h1> <b>Hello!</b>
Django-自動HTML轉義