2010-12-16 87 views
12

我可以採用某種配置模板工具包,以便:逃生HTML

[% foo %] 

做什麼,你現在需要說:

[% foo | html %] 

就是逃避HTML中foo?和做其他的事情,比如:

[% foo | noHtml %] 

如果我想逃?

回答

3

我想你可以通過擴展Template::Stash來創建自己的存儲空間,這樣它就可以通過默認的轉義變量。

這就是說我認爲這不是一個好主意。更好地堅持默認行爲,避免自定義修改,因爲它們當然令人困惑。

+1

自定義Template :: Stash可能不夠好。'[%x%]'和'[%y = x%]'都會調用存儲的'get()'方法來查找'x',但只有第一個產生輸出,存儲可能無法告訴「獲取和打印」和「獲取」之間的差異,所以你最終會得到很多雙/三/ ... HTML編碼的東西。可能最好不要打擾。 – 2010-12-17 01:56:49

+0

TT的設計哲學是默認允許跨站點腳本攻擊,並且只允許通過大量的犛牛剃鬚來保證安全。 – geira 2013-10-07 11:18:10

+0

是的,那太適合TT理念了。 – jeje 2014-02-12 15:54:21

1

我最近在這個問題上花了一些時間。這是我的解決方案的大綱。

我創建了一個名爲HtmlSafe的新類,它包含可安全寫入WWW客戶端而沒有安全漏洞的字符串。這個想法是,生成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 :: Directive中的textblock()函數,Template :: Parser使用它來生成任何試圖發出的文本塊的HtmlSafe實例。這些似乎與解析模板的文本節點對應,所以只是做

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」過濾器是無操作的,因爲無論如何,連接到HtmlSafe的任何東西都會被轉義。