2010-01-17 91 views

回答

84

剛使用django的safe過濾器。在您的模板,你會做這樣的事情:

{{ instance.my_text_field|safe }} 
+6

我非正式配音你接受的答案。謝謝! – mitchf 2010-12-24 06:16:17

+2

作爲警報,這允許XSS攻擊。 Javascript標籤可以用來輸入惡意代碼。 – Filipe 2016-08-11 18:07:31

+1

對,你應該小心這一點,只適用於'安全'過濾器的內容,你可以信任。這就是過濾器名稱所暗示的; ) – bjunix 2016-08-24 09:31:59

15

一種方式做到這一點是把一個函數模型將返回標記爲安全數據:

from django.utils.safestring import mark_safe 

class MyModel(models.Model): 
    my_textfield = models.TextField() 

    def display_my_safefield(self): 
     return mark_safe(self.my_textfield) 

然後在模板中,你將不得不使用:

{{ instance.display_my_safefield }} 
+1

這就是我所需要的:)非常感謝。 – Shark 2010-01-17 09:59:08

+6

如果您使用django的安全過濾器,則根本不需要修改模型。 – bjunix 2010-02-15 17:55:20

0

我認爲更好的方式來做到這一點是因爲@Daniel瓦薩洛描述。

爲什麼?

因爲這樣一來,你可以在你想顯示沒有逃逸,特別是防止交叉站點腳本(XSS )的HTML代碼做一些安全操作

例如,您可以檢查my_textfield是否包含腳本標記。
如果是這樣,將該實例標記爲惡意並返回轉義版本的my_textfield(正常的Django行爲)。
否則,請使用mark_safe返回標記爲安全的HTML代碼。

這裏:

from django.utils.safestring import mark_safe 

class MyModel(models.Model): 
    my_textfield = models.TextField() 
    is_malisious = models.BooleanField(default=False) 

    def display_my_safefield(self): 
     if '<script>' in self.my_textfield: 
      self.is_malicious = True 
      self.save() 
      return self.my_textfield 
     return mark_safe(self.my_textfield) 

而這一切不需要任何遷移到數據庫。

替代做法

我認爲你可以通過覆蓋模型的save()方法,以及包括檢查,並針對其內部惡意內容的任何其他必要的操作做到這一點的安全操作。然後,如果您確保保存的內容安全,則可以使用@bjunix解決方案。