2016-07-12 7 views
2

私はHTML Purifierを使用してユーザの入力を害しています。私は許可された要素のリストを設定しています。つまり、許可されたリストにないタグはすべて削除されます。以下のコード:HTML Purifier - ストリップの代わりに許可されていないタグをエスケープする

require_once "HTMLPurifier.standalone.php"; 
$config = HTMLPurifier_Config::createDefault(); 
$config->set('HTML.AllowedElements', array('strong','b','em','i')); 
$purifier = new HTMLPurifier($config); 
$safe_html = $purifier->purify($dirty_html)); 

だけではなく、その内容を保持したまま、私はリストに含まれていない要素をしたいと思いますが脱出し、テキストとして送り返されます。 、上記に示したホワイトリストが与えられると、次の入力文字列を説明するために


aがホワイトリストではないので

<a href="javascript:alert('XSS')"><strong>CLAIM YOUR PRIZE</strong></a> 

は、"<strong>CLAIM YOUR PRIZE</strong>"になります。同様に、

<b>Check the article <a href="http://example.com/">here</a></b> 

"<b>Check the article here</b>"になります。正規表現ベースの「ハック」に頼ることなく、HTML清浄機の設定を調整することによって、純粋

&lt;a href="javascript:alert('XSS')"&gt;<strong>CLAIM YOUR PRIZE</strong>&lt;/a&gt; 
<b>Check the article &lt;a href="http://example.com/"&gt;here&lt;/a&gt;</b> 

以下に上記の2つの例を有効にする方法はありますか?もしあれば、それはどのように行われたのか知りたい。

答えて

2

設定Core.EscapeInvalidTagsは、あなたが探しているものでなければなりません:

require_once(__DIR__ . '/library/HTMLPurifier.auto.php'); 

$dirty_html = '<a href="javascript:alert(\'XSS\')"><strong>CLAIM YOUR PRIZE<div></div></strong></a>'; 

$config = HTMLPurifier_Config::createDefault(); 
$config->set('HTML.AllowedElements', array('strong','b','em','i')); 
$config->set('Core.EscapeInvalidTags', true); 
$purifier = new HTMLPurifier($config); 
$safe_html = $purifier->purify($dirty_html); 

echo $safe_html . PHP_EOL; 

が...与える:あなたは何が起こるかを見ることができるように

&lt;a href="javascript:alert('XSS')"&gt;<strong>CLAIM YOUR PRIZE&lt;div /&gt;</strong>&lt;/a&gt; 

私はそこに無効な子要素<div></div>に投げました:HTML Purifierは元のHTMLを解析するために(<div></div><div />になります)、元のHTMLを変更しますが、情報はそのまま残ります(&lt;div /&gt;に変換されます)。

関連する問題