呈现用户创建的Django模板是否安全?

呈现用户创建的Django模板是否安全?,django,security,django-templates,Django,Security,Django Templates,让用户使用一组预定义变量创建自己的Django模板,然后在服务器上呈现该模板是否安全?我只会将一组非常有限的参数传递给render,所有这些参数都是字符串。模板类似于: hey, my name is {{name}}. 所以,问题是,是否有任何django模板标记可以被滥用来获取用户不应该获取的信息?我最担心的是{%url%}标记 附笔。 然而,我注意到在填写完标题后,我的问题略有不同。我可能根本不允许HTML/javascript,使用Textile/Markdown,或者找到一种方法将H

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

hey, my name is {{name}}.
所以,问题是,是否有任何django模板标记可以被滥用来获取用户不应该获取的信息?我最担心的是
{%url%}
标记

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

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

而且看起来对我来说太危险了,尤其是使用绝对路径的ssi。我认为这是一项风险太大的业务。

有三个主要风险:

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

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

  • 访问数据的用户不应看穿关系。当您将模型实例传递给模板时,其关系可能比您预期的更深入:
    {{current\u user.corporate\u account.owner.ssn}
    Oops。。。 一个好的预防措施是仔细检查模型关系,以确保没有暴露敏感的内容

  • 总的来说,只要您意识到上述风险,并将用户提供的字符串与常规模板分开呈现,我认为这是安全的。并确保严格禁止
    {%debug%}、{%include%}。{%ssi%}
    模板标记,因为它们会泄露相当敏感的信息。也许你可以谨慎行事,只允许变量和过滤器,完全禁止控制标签。

    这不安全,该公司表示:

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


    它比XSS攻击或访问用户数据更深入,如果您尝试这样做,您很可能会有一些漏洞,并且您不会意识到这些漏洞。

    “安全”?您是否担心模板中存在某种“SQL注入错误”?当然他们可以编写javascript并对页面进行完整的哈希处理。不是服务器。也不是他们的电脑。但是呈现的页面。这就是你担心的吗?我特别担心用户从服务器获取数据。另一个问题是,用户创建的页面会与其他用户发生冲突。“从服务器获取数据”?你这是什么意思?你能举个例子吗?请原谅这个措词马虎的说法。我的意思是,用户能够使用模板标记,将变量呈现到响应中,而该用户不应该访问该响应。例如Alex提到的
    {{current\u user.corporate\u account.owner.ssn}}
    之类的东西。如果我使用
    模板(“我的名字是{{{key}}”).render({key':'value\u pairs})
    ,除了字典中的变量外,它不会传递任何变量,因此用户将无法访问
    {request}
    ?如果所有变量都是字符串,我只需要担心
    {%ssi%},{%include%}
    等等?是的,这正是我所说的“与常规模板分开呈现”。您只需要担心控件标记和模型方法。在上面列出的
    模板
    对象上调用
    .render
    不会保护您免受使用
    ssi
    在“我的名字是”字符串中包含
    标记的人的攻击。当您说“明确禁止{%include%}等”时,您将如何实现这一点?是否在数据库保存时清理模板?或者在渲染时是否可以这样做?