1. 程式人生 > >Django-自動HTML轉義

Django-自動HTML轉義

ade AR Go 兩個 inter 跨站點 內容 轉換 類型

一、自動HTML轉義

  從模板生成HTML時,總會有變量包含影響最終HTML的字符風險,例如,考慮這個模板的片段:

Hello, {{ name }}

起初,這是一種顯示用戶名的無害方式,但考慮用戶輸入他們的名字時,輸入:

<script>alert(123)</script>

使用該名稱值的時候,模板在顯示的時候:

Hello, <script>alert(hello)</script>

這意味著瀏覽器會彈出一個JavaScript警告框!

顯然,用戶提交的數據不應該盲目地被信任,並且直接插入到您的網頁中,因為惡意用戶可能會使用這種漏洞來做可能不好的事情。

這種類型的安全漏洞被稱為 跨站點腳本(XSS)攻擊。

為了避免這個問題,你有兩個選擇:

  • 一,你可以確保通過escape過濾器運行每個不受信任的變量 (如下文檔所述),將可能有害的HTML字符轉換為無害的字符。這是在Django的最初幾年默認的解決方案,但問題是,它把責任推給,開發者/模板作者,以確保您逃避一切。忘記逃離數據很容易。
  • 二,你可以利用Django的自動HTML轉義。

默認情況下,在Django中,每個模板都會自動轉義每個變量標簽的輸出。具體來說,這五個字符是逃脫的:

  • < 轉換為 &lt;
  • > 轉換為 &gt;
  • (單引號)轉換為 &#39;
  • " (雙引號)轉換為 &quot;
  • & 轉換為 &amp;

我們再次強調,這種行為默認是開啟的。如果您使用的是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: &lt;b&gt;
This will not be escaped: <b>

對於模板塊

要控制模板的自動轉義,請將模板(或模板的特定部分)包裝到autoescape標記中,如下所示:

{% autoescape off %}
    Hello {{ name }}
{% endautoescape %}

autoescape標簽采用兩種onoff作為其參數。有時,您可能需要強制自動轉義,否則會被禁用。這是一個示例模板:

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 &amp; that</h1>
<b>Hello!</b>

Django-自動HTML轉義