【问题标题】:Untrusted templates in Python - what is a safe library to use?Python 中不受信任的模板 - 什么是可以使用的安全库?
【发布时间】:2009-11-11 17:43:15
【问题描述】:

我正在构建一个将在多个 Python 应用程序中使用的库。它从 RMDBS 中获取多语言的电子邮件模板,然后在发送电子邮件之前在 Python 中对模板进行变量替换。

除了变量替换,我还需要模板库来支持模板中的if、elif、for语句。

我在大多数项目中都使用 Mako,并且还研究了 Tempita,因为它没有提供很多我不需要的功能。

我担心的是不受信任的代码执行 - 有人可以指点我的 Python 模板解决方案,它要么不支持代码执行,要么允许我禁用它?

【问题讨论】:

  • 也许我应该取消 if/elif/for 要求,只使用 string.Template。那会很快,不需要额外的库,并且符合我的安全要求。
  • 也许您可以在 string.Template 周围编写一个非常薄的包装器以允许条件语句?
  • 我决定做的是创建一个 mapper() 函数来将一个对象绑定到一个 MailTemplate 对象。在调用mapper的时候,我定义了在模板编译期间的变量替换阶段可以使用Object的哪些属性。这样,如果我需要条件或循环逻辑,我只需在我的 Object 中使用@property def,然后我可以使用从该属性 def 返回的字符串并将其推入模板。

标签: python email templates


【解决方案1】:

来自Django book

因此,在 Django 模板中直接调用 Python 代码是不可能的。所有的“编程”基本上都局限于模板标签可以做的范围内。可以编写执行任意操作的自定义模板标签,但开箱即用的 Django 模板标签故意不允许执行任意 Python 代码。

试试Django templates。在 Django 应用程序之外进行设置有点棘手——与DJANGO_SETTINGS_MODULE 有关,四处搜索——但可能是可信的。

【讨论】:

  • 谢谢,这确实符合我禁用代码执行的要求。但是,我试图让这个库保持简单,我担心引入一些专为 Django 设计的库会与之背道而驰。
【解决方案2】:

您查看Jinja2 了吗?这几乎就是您所说的,它结合了强大的功能,同时保持简单,并且不会给设计师太多太多的权力。 :)

如果您使用过 Django 的模板系统,它与 Jinja 非常相似(如果不是基于?)。

【讨论】:

  • Jinja 的语法实际上是基于 Django 的模板,而不是相反。
猜你喜欢
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2020-02-25
  • 2017-05-20
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多