使用 HTML 和 DTML 的 Zope PostgreSQL 变量

Zope PostgreSQL variable with HTML and DTML

我有一个名为 blog_post 的 postgresql 数据库 table,在那个 table 中有一个名为 post_main 的列。该列存储整个博客 post 文章,包括各种 HTML 和 DTML 标签。

供参考(是的,我知道它很旧),这是带有 PostgreSQL 8.1.19 的 Zope 2.13

例如:

<p>This is paragraph 1</p>

<dtml-var "blog.sitefiles.post.postimg1(_.None, _)">

<p>This is paragraph 2</p>

dtml-var 标签告诉 Zope 在两段之间插入 dtml-document postimg1 的内容。

好的,没问题。我将这些数据毫无问题地存储在 postgres db table 中,与输入的完全一样,我是 运行 ZSQL 方法,通过 <dtml-in zsqlmethod> 标记围绕着整个dtml-document,以便能够在页面中调用我需要的变量。

通常情况下,在没有 HTML 代码或特别是没有 DTML 标记的情况下,将数据插入网页是没有问题的。如果您没有 html 标签并且只想要纯文本输出,您可以通过 &dtml-varname; 执行此操作,或者如果您希望数据被渲染并显示为正确 [=54],您可以通过 <dtml-var varname> 执行此操作=].

问题来了

Zope 只是 post 将 <dtml-var "blog.sitefiles.post.postimg1(_.None, _)"> 行添加到 html 页面,而不是像我直接将它输入 dtml-doc 时那样处理它。

我需要的:

我需要对存储在 post_main 列(上面引用为 varname)中的代码进行处理,就好像我将它直接输入到 dtml 文档中一样,以便 <dtml-var> 标签起作用他们应该工作的方式。

那么,您有一个包含 DTML 文档的变量,您想要执行该文档并插入结果吗?

老实说,我不确定单独使用 DTML 是否可行,因为用户通常不希望执行字符串中包含的代码。这与暴露用户提供的字符串的 eval()exec() 一样危险,就好像有人可以控制字符串,他们可以在 Zope 实例上执行任意代码。这相当于在数据库中存储 PHP 代码并执行它。

坦率地说,我很惊讶您在 Zope 2.13 上使用 DTML,而不是 PageTemplates,但我认为您有充分的理由这样做。

如果你想解释 DTML 变量的值而不是仅仅插入它,你需要明确地进行解释,使用类似的东西:

from DocumentTemplate.DT_HTML import HTML
return HTML(trusted_dtml_string)

问题在于,出于安全考虑,您无法通过网络在脚本 (Python) 中执行此操作。如果您将此作为外部方法或文件系统代码执行,则很可能会允许在您的服务器上执行任意代码。

恐怕我唯一的建议是避免这样做,很难做到正确并且错误可能是灾难性的。我强烈建议您不要将 DTML 标记存储为博客文章的一部分。

作为替代方案,如果您对 DTML 方法有固定数量的委托,我建议编写 Python 脚本,例如:

## Script (Python) "parse_variables"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=post, _
##title=
##
post = post.replace("##POST_IMAGE##", context.postimg(None, _))
return post

然后使用包含用户提供的数据的变量调用它,例如 <dtml-var expr="parse_variables(data, _)">