2013-07-18 111 views
2

我寫了這樣的過濾器在Perl需要幫助的HTML :: tagFilter

my $tf = HTML::TagFilter->new(
      allow => { 
       img => { src => [] }, 
       b => { all => [] }, 
       i => { all => [] }, 
       em => { all => [] }, 
       u => { all => [] }, 
       s => { all => [] } 
      } 
     ); 

$message_body = $tf->filter($message_body); 

現在我需要什麼,從這個過濾器要做的就是允許特定標記的,和IMG允許src屬性。代碼給出了很好的結果,除了像這樣的標籤<img src="cid:img.png" alt="Smiley face">它只是返回<img>而不是<img src="sid:imp.png">這正是我想要的,這裏有任何人知道爲什麼?!

回答

0

您需要設置skip_xss_protection爲1:

#!/usr/bin/perl 

use strict; 
use warnings; 
use HTML::TagFilter; 

my $tf = HTML::TagFilter->new(
      allow => { 
       img => {src => []}, 
       b => { all => [] }, 
       i => { all => [] }, 
       em => { all => [] }, 
       u => { all => [] }, 
       s => { all => [] } 
      }, 
      skip_xss_protection => 1, 
     ); 

my $html = qq{<img src="cid:img.png" alt="Smiley face">}; 

$html = $tf->filter($html); 
print $html; 

打印:

<img src="cid:img.png"> 
+0

你的答案效果很好 –

2

src屬性沒有被通過的原因是因爲模塊的跨站點腳本保護。值cid:img.png作爲無效URL被拒絕,因此該屬性被刪除。

來解決這個問題最整潔的方式是延長的有效協議列表中包含的cid,像這樣:

my @protocols = $tf->xss_permitted_protocols; 
push @protocols, 'cid'; 
$tf->xss_permitted_protocols(@protocols); 

$message_body = $tf->filter($message_body); 

如果設置log_rejects => 1在創建HTML::TagFilter對象,然後您可以檢查返回值通過$tf->report查看模塊拒絕HTML的每個組件的原因。

+0

你的答案效果很好 –