2016-07-12 5 views
2

Я использую HTML-очиститель для дезинфекции ввода пользователя. У меня настроен список разрешенных элементов, что означает, что любой тег, который не включен в разрешенный список, лишен. Код ниже:HTML-очиститель - исключить запрещенные теги вместо удаления

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 href="javascript:alert('XSS')"><strong>CLAIM YOUR PRIZE</strong></a> 

превращается в "<strong>CLAIM YOUR PRIZE</strong>", потому что a не в белом списке. Аналогичным образом,

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

будет "<b>Check the article here</b>".

Есть ли способ, чтобы включить вышеупомянутые два примера в следующий:

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

чисто путем изменения конфигурации HTML очистителя в , не прибегая к регулярным выражениям на основе «писаки»? Если есть, то я хотел бы знать, как это делается.

ответ

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-очиститель по-прежнему будет «изменять» исходный HTML из-за его разбора (<div></div> становится <div />), но информация остается (и преобразуется в &lt;div /&gt;).

Смежные вопросы