4

すべてのテンプレート変数を自動的にエスケープしたい、つまり、|escape常に記述しなくてもエスケープできるようにしたい。$escape_htmlしたがって、オプションを有効にしました。

ただし、Smarty は、{capture}信頼できる入力と見なすことができるにもかかわらず、同じ方法で作成された変数を扱うようです。私たちのコードベースにはそれらがたくさんあり、nofilterどこにでも書かなければならないことは、書く必要があるのと同じくらい面倒|escapeです。

確かにこれには解決策があるはずですか?または、$escape_htmlとは{capture}互換性がありませんか?

4

1 に答える 1

3

$escape_html{capture}定義上、互換性がないわけではありません。

$escape_html( {setfilter}およびdefault_modifiersと同様に) 変数のコンテキストがわからないという問題に悩まされています。これらは、変数が出力されると想定されるたびに実行されます。Smarty コンパイラが「ねえ、変数 $foo はキャプチャによって定義されたため、すでにエスケープされているため、再度エスケープしないでください」と認識できるようにする「その変数はどこから来たのか」という追跡はありません。「javascriptのキャプチャグループエスケープ内で、結果の文字列がhtmlとしてエスケープされる」などのシナリオを考えると、さらに悪化します。

現在、選択肢はかなり限られています。

  1. |エスケープが必要なものはすべてエスケープする
  2. nofilter エスケープしてはいけないものすべて (再び)

この問題について Smarty のコンパイラ メンテナと話し合い、何ができるかを考えます。しかし、解決策が見つかれば、Smarty 3.2 で導入される予定です。したがって、今のところ、エスケープ/フィルターなしを手動で実行してください。

于 2012-07-11T10:41:21.917 に答える