Mako模板和安全性

时间:2014-02-09 12:28:55

标签: python pyramid mako

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

<%!
import os

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

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

2 个答案:

答案 0 :(得分:1)

如果他们有自己独立的CMS实例,那就像Loic指出的那样无关紧要。但如果它们在某些共享环境中,最好使用另一个模板引擎。问题Untrusted templates in Python - what is a safe library to use?建议Django templatesJinja2

答案 1 :(得分:1)

仍有可能做你想做的事。 mako引擎允许您向模板添加预处理器。我不能肯定地说,因为我现在可以测试,但你可能会有这样的事情:

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

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 ......