2010-12-16 25 views
12

は私が何とかするようにテンプレートツールキットを構成することができます。エスケープHTML

ある
[% foo | html %] 

fooでHTMLをエスケープ:

[% foo %] 

は、あなたが今言う必要があるだろうかいますか?など、他の何かの操作を行います。私は場合

[% foo | noHtml %] 

は脱出したくありませんか?

答えて

3

Template::Stashを拡張して、デフォルトでエスケープ変数になるように独自の隠しを作成することができます。

それは良い考えではないと私は言った。デフォルトの動作に固執し、紛らわしいのでカスタム修正を控える方がよい。

+1

カスタムTemplate :: Stashはおそらく十分ではありません。'[%x%]'と '[%y = x%]'の両方はstashの 'get()'メソッドを呼び出して 'x'を検索しますが、最初のものだけが出力を生成します。 "getとprint"と "get"の違いを教えてください。そうすれば、ダブル/トリプル/ ... HTMLでエンコードされたものになります。おそらく最高の気にしないでください。 –

+0

TTのデザインフィリピンは、デフォルトでクロスサイトスクリプティング攻撃を許可し、多量のヤクシェービングによるセキュリティのみを許可することです。 – geira

+0

それはTTの哲学に合うにはあまりにも便利だろう。 – jeje

5

自分自身で同じ質問に答えようとしているときに、あなたの質問に完全に遭遇しました。

http://search.cpan.org/~mithaldu/Template-AutoFilter/私たちが望んでいるようですが、別のモジュールをインストールする必要があります。とにかく試してみるつもりです。

1

最近、この問題に少し時間をかけました。ここに私のソリューションの概要があります。

セキュリティ上の脆弱性なしに安全に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に連結されたものは、とにかくエスケープされるからです。

関連する問題