PHP видалити всі HTML-атрибути подій у тезі HTML

Я хотів би видалити всі атрибути події (наприклад, з усіх подій на основі посилання на подію списку ).

Чи існує функція в класі DOMDocument PHP, що розпізнає атрибути подій?

Я спробував використовувати RegEx, але він став ускладнюватися одинарними лапками та подвійними лапками:

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

Я спробував зовнішню бібліотеку з назвою HTMLPurifier, але вона не має можливості видалити всі атрибути події.

Будь-яка ідея про те, які напрямки потрібно взяти або просте рішення?

0
Не впевнені, для чого призначений перший * - ви телефонуєте його, шукаючи такі речі, як onnnnnclick або навіть oclick - код > * впливає лише на n .
додано Автор Niet the Dark Absol, джерело
З вашим поточним кодом я можу зробити це: onClick = 'omghaxorz ();'
додано Автор Niet the Dark Absol, джерело
@ user1105430: Для цього використовуйте DOM.
додано Автор Casimir et Hippolyte, джерело
@ user1105430: Для цього використовуйте DOM.
додано Автор Casimir et Hippolyte, джерело
@ user1105430: Для цього використовуйте DOM.
додано Автор Casimir et Hippolyte, джерело
додано Автор SamSquanch, джерело
чому б не використовувати PHP filter_var() ? Видалення JS події не вирішення.
додано Автор Zulkhaery Basrul, джерело
чому б не використовувати PHP filter_var() ? Видалення JS події не вирішення.
додано Автор Zulkhaery Basrul, джерело
"<�Я спробував зовнішню бібліотеку з назвою HTMLPurifier, але вона не має можливості видалити всі атрибути подій. " Не зовсім. За промовчанням він видаляє всі шкідливі HTML-коди, а для деяких небезпечних HTML-кодів потрібно переходити через обручі, щоб він прийняв їх незалежно. (Не зрозумійте мене, хоча - це - хороша річ.) Я рекомендую дати йому ще одну спробу. :)
додано Автор pinkgothic, джерело
"<�Я спробував зовнішню бібліотеку з назвою HTMLPurifier, але вона не має можливості видалити всі атрибути подій. " Не зовсім. За промовчанням він видаляє всі шкідливі HTML-коди, а для деяких небезпечних HTML-кодів потрібно переходити через обручі, щоб він прийняв їх незалежно. (Не зрозумійте мене, хоча - це - хороша річ.) Я рекомендую дати йому ще одну спробу. :)
додано Автор pinkgothic, джерело
"<�Я спробував зовнішню бібліотеку з назвою HTMLPurifier, але вона не має можливості видалити всі атрибути подій. " Не зовсім. За промовчанням він видаляє всі шкідливі HTML-коди, а для деяких небезпечних HTML-кодів потрібно переходити через обручі, щоб він прийняв їх незалежно. (Не зрозумійте мене, хоча - це - хороша річ.) Я рекомендую дати йому ще одну спробу. :)
додано Автор pinkgothic, джерело
Білий список безпечніше, ніж чорні списки.
додано Автор Lesleh, джерело
смію запитати, чому?
додано Автор user557846, джерело
це навряд чи буде достатньо для захисту від зловмисних користувачів iframe Вбудований список потенційних користувачів великий
додано Автор user557846, джерело
@SamSquanch, що працює! Ця функція працює.
додано Автор user1105430, джерело
@SamSquanch, що працює! Ця функція працює.
додано Автор user1105430, джерело
@SamSquanch, що працює! Ця функція працює.
додано Автор user1105430, джерело
@Dagon Я маю форму, яка дозволяє користувачеві відображати їх HTML-статті своєї статті, але обмежує їх використання нульового javascript: не містить тегів сценарію, тегів посилань і DEFINITELY без тегів атрибутів подій.
додано Автор user1105430, джерело

8 Відповіді

Якщо ви хочете по-справжньому захищеного коду, білий список підхід ("тільки дозволити ці речі: ..."), як правило, міцний, ніж чорний список підхід ("не дозволяти ці речі: ...").

Ви згадали про очищувач HTML і що " він не має можливості видалити всі атрибути події ".

Це ... технічно правильно, тому ви не можете сказати про видалення атрибутів події. Причина - це точка продажу, однак: вона робить це автоматично. Параметр "відсутній" - це можливість налаштувати HTML Purifier на дозвіл атрибутів події. Це навмисно не так. HTML Purifier (як випливає з назви) має сильний фокус безпеки.

Є деякі 'небезпечні HTML' аспекти, які ви можете дозволити використовувати конфігурацію HTML Purifier (конфігурація за замовчуванням навмисно прискіплива), але атрибути події не є серед них. (Ну, ви можете навчити HTML Purifier прийняти їх, якщо ви перескочили через обручі, але це займе багато зусиль.)

Я рекомендую надати йому ще одну спробу, якщо ви хочете прийняти HTML-код користувача. Це досить усталений інструмент, який був перевірений багатьма людьми.

Є кілька дуже складних способів розірвати HTML і інжекції JavaScript. Наприклад, чи знаєте ви, що ви можете вставити JavaScript за допомогою атрибута src або href ? Чи знаєте ви, що в деяких веб-переглядачах можна ввести JavaScript за допомогою тега style ? Ознайомтеся з цією читкою XSS . Це може дати вам приблизне уявлення про те, що ви проти, і чому білий список, як правило, вважається більш ефективним.

У будь-якому випадку, удачі!

1
додано
Я подивимося на це. Дякую
додано Автор user1105430, джерело

Якщо ви хочете по-справжньому захищеного коду, білий список підхід ("тільки дозволити ці речі: ..."), як правило, міцний, ніж чорний список підхід ("не дозволяти ці речі: ...").

Ви згадали про очищувач HTML і що " він не має можливості видалити всі атрибути події ".

Це ... технічно правильно, тому ви не можете сказати про видалення атрибутів події. Причина - це точка продажу, однак: вона робить це автоматично. Параметр "відсутній" - це можливість налаштувати HTML Purifier на дозвіл атрибутів події. Це навмисно не так. HTML Purifier (як випливає з назви) має сильний фокус безпеки.

Є деякі 'небезпечні HTML' аспекти, які ви можете дозволити використовувати конфігурацію HTML Purifier (конфігурація за замовчуванням навмисно прискіплива), але атрибути події не є серед них. (Ну, ви можете навчити HTML Purifier прийняти їх, якщо ви перескочили через обручі, але це займе багато зусиль.)

Я рекомендую надати йому ще одну спробу, якщо ви хочете прийняти HTML-код користувача. Це досить усталений інструмент, який був перевірений багатьма людьми.

Є кілька дуже складних способів розірвати HTML і інжекції JavaScript. Наприклад, чи знаєте ви, що ви можете вставити JavaScript за допомогою атрибута src або href ? Чи знаєте ви, що в деяких веб-переглядачах можна ввести JavaScript за допомогою тега style ? Ознайомтеся з цією читкою XSS . Це може дати вам приблизне уявлення про те, що ви проти, і чому білий список, як правило, вважається більш ефективним.

У будь-якому випадку, удачі!

1
додано
Я подивимося на це. Дякую
додано Автор user1105430, джерело

Як зробити це за допомогою DOM.

The following code seeks and removes attributes whose name starts by "on" in all html tags.
($html stands for the html code)

$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
додано

Як зробити це за допомогою DOM.

The following code seeks and removes attributes whose name starts by "on" in all html tags.
($html stands for the html code)

$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
додано

Як зробити це за допомогою DOM.

The following code seeks and removes attributes whose name starts by "on" in all html tags.
($html stands for the html code)

$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, джерело

Завантажте документ 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, джерело

Завантажте документ 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, джерело
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php