我有一个想法是将模板放在数据库中,并为设计人员提供直接从CMS面板编辑模板的可能性。但是困扰我的是安全问题。如果我们能够将python命令直接放在模板中,那怎么可能是安全的呢?如果我在mako模板中有这样的东西:
<%!
import os
os.system('rm /var/www/env/harmless.txt')
%>
它将成功执行并且无害.txt将被删除。我应该找到除Mako之外的其他模板引擎,还是我能以某种方式配置Mako以防止有害代码注入?另一方面,一些python命令在模板中使用非常有用,例如内联 if语句。
答案 0 :(得分:1)
如果他们有自己独立的CMS实例,那就像Loic指出的那样无关紧要。但如果它们在某些共享环境中,最好使用另一个模板引擎。问题Untrusted templates in Python - what is a safe library to use?建议Django templates和Jinja2。
答案 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 ......