は私が何とかするようにテンプレートツールキットを構成することができます。エスケープHTML
ある[% foo | html %]
、foo
でHTMLをエスケープ:
[% foo %]
は、あなたが今言う必要があるだろうかいますか?など、他の何かの操作を行います。私は場合
[% foo | noHtml %]
は脱出したくありませんか?
は私が何とかするようにテンプレートツールキットを構成することができます。エスケープHTML
ある[% foo | html %]
、foo
でHTMLをエスケープ:
[% foo %]
は、あなたが今言う必要があるだろうかいますか?など、他の何かの操作を行います。私は場合
[% foo | noHtml %]
は脱出したくありませんか?
Template::Stashを拡張して、デフォルトでエスケープ変数になるように独自の隠しを作成することができます。
それは良い考えではないと私は言った。デフォルトの動作に固執し、紛らわしいのでカスタム修正を控える方がよい。
自分自身で同じ質問に答えようとしているときに、あなたの質問に完全に遭遇しました。
http://search.cpan.org/~mithaldu/Template-AutoFilter/私たちが望んでいるようですが、別のモジュールをインストールする必要があります。とにかく試してみるつもりです。
最近、この問題に少し時間をかけました。ここに私のソリューションの概要があります。
セキュリティ上の脆弱性なしに安全にWWWクライアントに書き込むことができる文字列を含むHtmlSafeという新しいクラスを作成しました。 HTMLタグを生成する関数はHtmlSafeオブジェクトを返し、ボックスの外の変数はHtmlSafeではないという考えがありました。 HtmlSafeを作成するものは何でも、問題の文字列の安全性を保証しています。非HTML安全文字列とHTML安全文字列を連結すると、非HTML安全文字列がCGI :: escapeHTMLでエスケープされ、HTML安全文字列と結合されます。 HtmlSafeの別のインスタンスをHtmlSafeに連結すると、問題の文字列がエスケープされずに結合されます。私は過負荷を使用して終了したので、私は再定義することができます。 HtmlSafeクラスの演算子です。この事と
武装は、私が実際にこのように、HtmlSafeとの連結を呼び出されたサブだった$出力変数を機能)($テンプレート - >プロセスを与えた:
my $output = HtmlSafe->new("");
$template->process($vars, sub { $output .= $_[0]; });
return $output->unwrap(); # remove HtmlSafe and return underlying string
私たちは、ほぼ準備ができていますHtmlSafe TT2を使用します。私が実際にやらなければならなかった大きな変更は、Template :: ParserがHtmlSafeインスタンスを生成するために使用するTemplate :: Directiveのtextblock()関数を変更することでした。これらは、これだけ、私はそうのようにパーサーに与えた
package MyDirective;
use base "Template::Directive";
sub textblock { my $self = shift; return "$Template::Directive::OUTPUT HtmlSafe->new(" . $self->text(@_) . ")"; }
やって、解析されたテンプレートのテキストノードに対応して表示されます。これに加えて
my $parser = Template::Parser->new({
FACTORY => "MyDirective",
});
を、私は「なし」フィルタを定義しましたHtmlSafeとして定義されているものを単にラップするTT2のために、生のHTMLを出力することができます。これにより、エスケープすることが回避されます。デフォルトの「html」フィルタはno-opです。なぜなら、HtmlSafeに連結されたものは、とにかくエスケープされるからです。
カスタムTemplate :: Stashはおそらく十分ではありません。'[%x%]'と '[%y = x%]'の両方はstashの 'get()'メソッドを呼び出して 'x'を検索しますが、最初のものだけが出力を生成します。 "getとprint"と "get"の違いを教えてください。そうすれば、ダブル/トリプル/ ... HTMLでエンコードされたものになります。おそらく最高の気にしないでください。 –
TTのデザインフィリピンは、デフォルトでクロスサイトスクリプティング攻撃を許可し、多量のヤクシェービングによるセキュリティのみを許可することです。 – geira
それはTTの哲学に合うにはあまりにも便利だろう。 – jeje