2016-07-12 11 views
2

Ich benutze HTML Purifier, um Benutzereingaben zu bereinigen. Ich habe eine Liste von erlaubten Elementen konfiguriert, was bedeutet, dass jedes Tag, das nicht in der erlaubten Liste ist, entfernt wird. Code unten:HTML Purifier - Escape-Tags nicht zulassen, statt zu entfernen

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)); 

Anstatt nur ihre Inhalte zu halten, würde ich die Elemente wie die entkommen und schickte als Text zurück sind nicht in die Liste aufgenommen werden.


Zur Veranschaulichung der folgenden Eingabezeichenfolge gezeigt über die weiße Liste gegeben,:

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

in "<strong>CLAIM YOUR PRIZE</strong>" dreht, weil a nicht die weiße Liste gesetzt wird. In ähnlicher Weise wird

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

wird "<b>Check the article here</b>".

Gibt es eine Möglichkeit, die beiden oben genannten Beispiele in den folgenden zu drehen:

&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> 

rein HTML Purifier Konfiguration Einstellung ohne zu regulären Ausdruck-basierte „Hacks“ zurückgreifen? Wenn ja, würde ich gerne wissen, wie es geht.

Antwort

2

Die Core.EscapeInvalidTags Einstellung sollte das sein, was Sie suchen:

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; 

... gibt:

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

ich in dem ungültigen Kind-Element warf <div></div> es so können Sie sehen, was passiert, : HTML Purifier wird immer noch das ursprüngliche HTML aufgrund des Parsens verändern (<div></div> wird), aber die Information bleibt (und wird in &lt;div /&gt; konvertiert).

Verwandte Themen