渲染用户创建的Django模板是否安全?

时间:2010-02-23 15:29:16

标签: django security django-templates

让用户使用一组预定义变量制作自己的Django模板,然后在服务器上呈现此模板是否安全?我只会将一组非常有限的参数传递给render,所有参数都是字符串。模板类似于:

hey, my name is {{name}}.

所以,问题是,是否有任何django模板标签可以被滥用以获取用户不应该获得的信息?我最担心的是{% url %}标签。

P.S。

在填写标题后我注意到this question,但是,我的问题略有不同。我可能根本不允许使用HTML / javascript,使用Textile / Markdown,或者找到一种方法将HTML限制为一组非常基本的标签。

4 个答案:

答案 0 :(得分:5)

有三个主要风险:

  1. 修改数据的用户。例如,渲染{{ request.user.kill }}将在值查找期间触发kill()调用。为防止这种情况,您应在模型代码中设置kill.alters_data = True。所有修改数据的内置模型方法都已标记,因此风险仅与您自己的方法或由编写不当的第三方应用程序提供的方法相关联。

  2. 用户直接访问他们看不到的数据。当使用RequestContext时(大多数情况下),模板渲染上下文中添加了许多变量。添加用户定义的模板,您将获得非常危险的混合,因为用户可以查看任何上下文处理器添加的任何内容。

  3. 访问数据的用户不应通过关系查看。当您将模型实例传递给模板时,它的关系可以比您预期的更进一步:{{ current_user.corporate_account.owner.ssn }}糟糕... 一个好的预防措施是仔细检查你的模型关系,以确保你没有暴露敏感的东西。

  4. 总的来说,只要您了解上述风险并将用户提供的字符串与常规模板分开呈现,我就会说它是安全的。并确保您明确禁止{% debug %}, {% include %}. {% ssi %}模板标记,因为它们可以泄露相当敏感的信息。也许你可以安全地玩它,只允许变量和过滤器,并且完全禁止控制标签。

答案 1 :(得分:4)

includessi看起来太危险了,特别是使用绝对路径的ssi。我认为这是一个风险太大的业务。

答案 2 :(得分:3)

嗯,从服务器端的角度来看它是安全的(可能没有人审核过它),但是用户显然可以生成他们想要执行XSS攻击的任何Javascript。

答案 3 :(得分:0)

这不安全,templates documentation说:

模板系统对不受信任的模板作者是不安全的。例如,网站不应该允许其用户提供自己的模板,因为模板作者可以执行诸如XSS攻击和访问可能包含敏感信息的模板变量属性之类的事情。

它的运行范围不仅限于XSS攻击或访问用户数据,如果尝试这样做,则很可能会存在一些漏洞,并且您不会意识到它们。