1

blog_post という postgresql db テーブルがあり、そのテーブルには post_main という列があります。その列には、さまざまな HTML および DTML タグを含む、ブログ投稿記事全体が格納されます。

参考までに (もちろん古いことは知っています)、これは Zope 2.13 with 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 タグは、2 つの段落の間に dtml-document postimg1 の内容を挿入するように Zope に指示しています。

OK、問題ありません。入力されたとおりに、このデータをpostgres dbテーブルに問題なく保存して<dtml-in zsqlmethod>います。必要な変数を呼び出すことができるように、dtmlドキュメント全体を囲むタグを介してZSQLメソッドを実行していますページ。

通常、HTML コードがなくても、特に DTML タグがなくても、データを Web ページに挿入しても問題ありません。&dtml-varname;html タグがなくプレーンテキスト出力のみが必要な場合、または<dtml-var varname>データをレンダリングして適切な html として表示したい場合は、これを行います。

ここに問題があります

Zope は<dtml-var "blog.sitefiles.post.postimg1(_.None, _)">、dtml-doc に直接入力したときのように行を処理するのではなく、行を html ページにポストするだけです。

必要なもの:

post_main 列 (上で varname として参照) に格納されたコードを、dtml ドキュメントに直接入力したかのように処理して、<dtml-var>タグが想定どおりに機能するようにする必要があります。

4

1 に答える 1

1

DTML ドキュメントを含む変数があり、そのドキュメントを実行して結果を挿入したいですか?

正直なところ、DTML だけでそれが可能かどうかはわかりません。一般に、ユーザーは文字列に含まれるコードを実行したくないからです。これは、誰かが文字列を制御できるかのように、Zope インスタンスで任意のコードを実行できる場合と同様に、ユーザーが提供した文字列を公開しeval()たり、公開したりするのと同じ危険です。exec()これは、データベースに PHP コードを保存して実行するのと同じです。

率直に言って、Zope 2.13 で PageTemplates ではなく DTML をまったく使用していることに驚いていますが、それには十分な理由があると思います。

DTML 変数の値を単に挿入するのではなく解釈したい場合は、次のようなものを使用して明示的に解釈する必要があります。

from DocumentTemplate.DT_HTML import HTML
return HTML(trusted_dtml_string)

これに関する問題は、セキュリティ上の懸念から、Web を介してスクリプト (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 に答える