让用户使用一组预定义的变量制作自己的Django模板,然后在服务器上渲染这个模板是否安全?我只会传递一组非常有限的参数来渲染,所有参数都是字符串.模板将是这样的:
hey,my name is {{name}}.
所以,问题是,是否有任何django模板标签可以被滥用来获取用户不应该得到的信息?我最担心的是{%url%}标签.
附:
在填写标题后我注意到this question,但是,我的问题略有不同.我可能根本不允许使用HTML / javascript,使用Textile / Markdown,或者找到一种方法将HTML限制为一组非常基本的标签.
解决方法
有三个主要风险:
>用户修改数据.例如,渲染{{request.user.kill}}将在值查找期间触发kill()调用.要防止这种情况,您应该在模型代码中设置kill.alters_data = True.所有修改数据的内置模型方法都已标记,因此风险仅与您自己的方法或由写得不好的第三方应用程序提供的方法相关联.
>用户直接访问他们看不到的数据.使用RequestContext时(大部分时间都是这样),模板渲染上下文中添加了许多变量.添加用户定义的模板,您将获得非常危险的混合,因为用户可以查看任何上下文处理器添加的任何内容.
>访问数据的用户不应通过关系查看.当您将模型实例传递给模板时,它的关系可能会比您预期的更进一步:{{current_user.corporate_account.owner.ssn}}哎呀……
一个好的预防措施是仔细检查你的模型关系,以确保你没有暴露敏感的东西.
总的来说,只要您了解上述风险并将用户提供的字符串与常规模板分开呈现,我就会说它是安全的.并确保您明确禁止{%debug%},{%include%}. {%ssi%}模板标签,因为它们可以泄露相当敏感的信息.也许你可以安全地玩,只允许变量和过滤器,并完全禁止控制标签.