关于python:Mako模板和安全性

Mako templates and security

我有一个将模板放入数据库中的想法,并为设计人员提供了直接从CMS面板编辑模板的可能性。 但是困扰我的是安全问题。 如果我们能够直接在模板中放置python命令,那怎么可能是安全的。 如果我在mako模板中有这样的内容:

1
2
3
4
5
<%!
import os

os.system('rm /var/www/env/harmless.txt')
%>

它将成功执行,并且harmless.txt将被删除。 我应该寻找除Mako之外的其他模板引擎,还是可以以某种方式配置Mako以防止有害代码注入? 另一方面,在模板中使用某些python命令非常有用,例如内联if语句。


仍有可能做您想做的事。 mako引擎可让您将预处理器添加到模板。我目前无法测试,因此无法确定,但是您可能会遇到类似以下情况:

此处:http://docs.makotemplates.org/en/latest/usage.html#mako.template.Template.params.preprocessor

1
2
3
4
5
def removeImports(source):
    # remove whatever you don't want inside the template
    return new_source

tpl = Template(...., preprocessor=removeImports)

如果您使用的是pyramid之类的框架,则可以使其成为新的渲染器,以在所有模板上为您执行此操作。

出于安全考虑,如果您想采用这种方式,因为我个人认为Mako是非常好的引擎。您应该在预处理器上做一组很好的测试用例。我非常确定可以在内联python <% %>中实现导入。实际上imports几乎可以在模板内的任何位置实现,因为您几乎可以在任何地方使用内联python。

因此,如果您担心要在模板中运行python,可以考虑使用其他模板,例如Chameleon,Jinja2 ...


如果他们有自己的CMS单独实例,那就像Loic指出的一样。但是,如果它们处于某些共享环境中,则最好使用另一个模板引擎。问题Python中的不受信任的模板-使用什么安全库?建议使用Django模板和Jinja2。