1

我有一个名为 blog_post 的 postgresql 数据库表,在该表中有一个名为 post_main 的列。该列存储整个博客文章,包括各种 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 表中,与输入的完全相同,并且我正在通过<dtml-in zsqlmethod>围绕整个 dtml 文档的标签运行 ZSQL 方法,以便能够调用我需要的变量这页纸。

通常,在没有 HTML 代码或特别是没有 DTML 标签的情况下,将数据插入网页是没有问题的。&dtml-varname;如果您没有 html 标记并且只想要纯文本输出,或者<dtml-var varname>您希望将数据呈现并显示为正确的 html ,您可以这样做。

这就是问题所在

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

我需要的:

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

4

1 回答 1

1

那么,您有一个包含 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, _)">

于 2020-05-06T14:03:20.127 回答