Zope PostgreSQL переменная с HTML и DTML - PullRequest
1 голос
/ 05 мая 2020

У меня есть таблица postgresql db с именем blog_post и в этой таблице столбец с именем post_main. В этом столбце хранится вся статья в блоге, включая различные теги HTML и DTML.

Для справки (и да, я знаю, что он старый), это Zope 2.13 с PostgreSQL 8.1.19

Например:

<p>This is paragraph 1</p>

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

<p>This is paragraph 2</p>

Тег dtml-var сообщает Zope вставить содержимое dtml-документа postimg1 между двумя абзацами.

Хорошо, нет проблем. Я без проблем храню эти данные в таблице postgres db, точно так, как они были введены, и я запускаю метод Z SQL через тег <dtml-in zsqlmethod>, который окружает весь dtml-документ, чтобы иметь возможность для вызова переменных, которые мне нужны на странице.

Обычно и без кода HTML ИЛИ, особенно без тегов DTML, вставка данных на веб-страницу не проблема. Вы делаете это через &dtml-varname;, если у вас нет тегов html и просто хотите выводить простой текст, ИЛИ вы делаете <dtml-var varname>, если хотите, чтобы данные отображались и отображались как правильные html.

Вот в чем проблема

Zope просто отправляет строку <dtml-var "blog.sitefiles.post.postimg1(_.None, _)"> на страницу html вместо того, чтобы обрабатывать ее, как когда я ввожу ее напрямую в dtml-do c.

Что мне нужно:

Мне нужно, чтобы код, хранящийся в столбце post_main (указанный выше как varname), обрабатывался, как если бы я ввел его непосредственно в dtml- документ, чтобы теги <dtml-var> работали так, как должны работать.

1 Ответ

1 голос
/ 06 мая 2020

Итак, у вас есть переменная, содержащая документ DTML, и вы хотите выполнить этот документ и вставить результаты?

Честно говоря, я не уверен, что это возможно только в DTML, так как это обычно пользователи не хотят выполнять код, содержащийся в строках. Это та же опасность, что и раскрытие eval() или exec() строк, предоставленных пользователем, как если бы кто-то мог контролировать строку, выполняемую произвольным кодом в экземпляре Zope. Это эквивалент хранения кода PHP в вашей базе данных и его выполнения.

Честно говоря, я удивлен, что вы вообще используете DTML в Zope 2.13, а не PageTemplates, но я предполагаю, что у вас есть веская причина для этого.

Если вы хотите интерпретировать значение переменной DTML, а не просто вставлять ее, вам нужно явно выполнить интерпретацию, используя что-то вроде:

from DocumentTemplate.DT_HTML import HTML
return HTML(trusted_dtml_string)

Проблема в том, что вы не можете сделать это в скрипте (Python) через Интернет из соображений безопасности. Если вы сделаете это как внешний метод или код файловой системы, очень вероятно, что вы разрешите выполнение произвольного кода на своем сервере.

Боюсь, моя единственная рекомендация - избегать этого, очень сложно получить это правильно и ошибки могут быть катастрофическими c. Я настоятельно рекомендую вам не хранить теги 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, _)">

...