直接在Django模板中呈现URLField是否安全?

时间:2013-08-14 04:01:37

标签: django security

我有一个使用URLField的简单Django模型

class Place(Model):

    website = models.URLField(        
        max_length=64,
        blank=True
    )
    ...

website字段由使用应用程序前端的用户填充。我的问题是:我应该清理这个字段还是可以直接在模板中呈现?

<a href={{ website }}>The Place' website</a>

这样做会出现安全问题吗?

1 个答案:

答案 0 :(得分:2)

URLField只是CharField some regex validation,可确保输入类似于网址,因此您的表单会拒绝任何非类似URL的字符串。

此外,在将URL输出到模板时,Django会执行escaping on template variables by default

By default in Django, every template automatically escapes the output of every variable tag. 

也就是说,没有什么可以阻止人们发布到恶意网站或垃圾网站的有效链接,或者向网址等添加GET参数,因此您仍然无法确定该网站是否安全。


顺便说一句,在Django 1.5之前,有一个verify_exists=True/False参数,您可以使用would perform an actual web request to the URL during validation来实例化URLField,以查看它是否存在,但是this was depreciated

  

django.db.models.fields.URLField.verify_exists将被删除。由于难以处理的安全性和性能问题,该功能在1.3.1中已弃用,并且将遵循稍微加快的弃用时间范围。