【问题标题】:Mako templates and securityMako 模板和安全性
【发布时间】:2014-03-06 17:04:31
【问题描述】:

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

<%!
import os

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

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

【问题讨论】:

  • 如果人们运行自己的 cms,我并不太担心。为什么他们会试图伤害?如果您担心安全性,那么只需在沙箱中运行 python。
  • 您可以通过使用 javascript 模板系统完全消除该问题,并在客户端执行所有呈现(和代码执行)。 EJS 和 Teacup 各有千秋,虽然 teacup 是基于 coffeescript,如果你只是使用直接的 JS,这会增加额外的复杂性。

标签: python pyramid mako


【解决方案1】:

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

【讨论】:

  • 然而,现在我想到了 mako 引擎有一个预处理器功能。您可以预处理模板以删除您不想要的任何内容。
  • “你不想要”听起来像是管理一个黑名单,这在安全方面从来都不是一个好主意。如果可能的话,最好使用已经保存的东西。但是是的,这是一个可能的解决方案。
【解决方案2】:

仍有可能做你想做的事。 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 是一个非常好的引擎。你应该在你的预处理器上做一套好的测试用例。我很确定可以在 inline python &lt;% %&gt; 中实现导入。实际上imports 几乎可以在模板内的任何地方实现,因为您几乎可以在任何地方使用内联python。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 2011-12-26
    • 2019-12-13
    • 2021-04-19
    • 2018-12-02
    • 2013-06-25
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多