2013-06-24 2 views
0

Я хотел бы удалить все атрибуты событий (например, из всех событий на основе Event reference list).PHP удаляет все атрибуты HTML-событий в теге HTML

Есть ли функция в классе DOMDocument PHP, которая распознает атрибуты событий?

Я попытался с помощью регулярных выражений, но он получил сложный с одиночными и двойными кавычками:

preg_replace('/on*[a-z]+=".*?"/i', '', $html); // Doesn't match onclick="alert(\"hello\");" 

Я попытался внешняя библиотека называется HTMLPurifier, но он не имеет возможности удалить все атрибуты события.

Любая идея, какие направления взять или простое решение?

+0

осмелюсь спросить, почему? –

+0

@Dagon У меня есть форма, которая позволяет пользователю отображать свой HTML-код своей статьи, но ограничивать их использованием нулевого javascript: никаких тегов скриптов, никаких тегов ссылок и DEFINITELY без тегов атрибутов событий. – user1105430

+2

[Это то, что вы имеете в виду] (http://ideone.com/6FsFa) – SamSquanch

ответ

0

Способ сделать это с помощью DOM.

Следующий код ищет и удаляет атрибуты, имя которых начинается с «on» во всех тегах html.
($html обозначает HTML код)

$doc = new DOMDocument(); 
@$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 

$onAttributes = $xpath->query("//*/@*[starts-with(name(), 'on')]"); 
foreach ($onAttributes as $onAttribute) { 
    $onAttribute->ownerElement->removeAttributeNode($onAttribute); 
} 

$body = $xpath->query('body')->item(0); 
$result = substr($doc->saveHTML($body),6,-7); 
0

Загрузите HTML документ, перебрать все элементы, а затем над всеми атрибутами них (вложенные), удалите атрибуты, если они начинаются с on:

$doc = new DOMDocument(); 
$doc->loadHTML($html); 

foreach ($doc->getElementsByTagname('*') as $element) 
{ 
    foreach (iterator_to_array($element->attributes) as $name => $attribute) 
    { 
     if (substr_compare($name, 'on', 0, 2, TRUE) === 0) 
     { 
      $element->removeAttribute($name); 
     } 
    } 
} 

Вы также можете очистить список известных имен атрибутов и дать предупреждение, если неизвестный найден (или есть белый список разрешенных атрибутов). Надеюсь, что это поможет, код быстро набирается, чтобы иметь некоторые небольшие ошибки.

+0

любая причина для iterator_to_array()? я имею в виду, что foreach * означает * для итераторов. – Riki137

1

Если вы хотите по-настоящему безопасный код, подход с белым списком («разрешить только эти вещи: ...»), как правило, более прочный, чем подход «черного списка» («не допускайте этих вещей: ...»).

Вы упомянули HTML-очиститель и что «у него нет возможности удалить все атрибуты событий».

Это технически правильно, так как вы не можете сообщить, чтобы удалить атрибуты событий. Причина в том, что это точка продажи, но это автоматически. Опция «отсутствует» - это возможность настроить HTML-очиститель на , чтобы атрибуты события. Это сознательно неловко. HTML очиститель (как следует из названия) имеет сильную направленность безопасности.

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

Я бы рекомендовал попробовать еще раз, если вы хотите принять пользовательский HTML. Это довольно простой инструмент, проверенный многими людьми.

Есть несколько очень сложных способов разбить HTML и ввести JavaScript. Например, знаете ли вы, что вы можете использовать JavaScript, используя атрибут или href? Знаете ли вы, что в некоторых браузерах вы можете использовать JavaScript, используя тег style?Взгляните на this XSS cheatsheet. Это может дать вам общее представление о том, с чем вы столкнулись, и почему белый список обычно считается более эффективным.

В любом случае, удачи!

+0

Я рассмотрю это. благодаря – user1105430