Любите загадки? Событие еще доступно на сайте.

Безопасна ли функция `strip_tags`?

В старых приложениях на PHP часто используются встроенные функции безопасности, такие как strip_tags(), htmlspecialchars() и htmlentities(). Каждая из них работает по-разному, но насколько они действительно безопасны для использования? И когда следует использовать каждую из них?

Давайте рассмотрим функцию strip_tags() и, надеюсь, найдем ответы на эти вопросы! Согласно документации PHP:

Функция пытается возвратить строку, из которой удалены все NULL-байты, HTML- и PHP-теги из заданной строки (string). Для удаления тегов используется тот же механизм, что и в функции fgetss().

Сама функция имеет два параметра: первый обязателен и представляет собой строковое значение, из которого происходит удаление, а второй – необязательный список разрешенных HTML-тегов.

strip_tags(string $string, array|string|null $allowed_tags = null): string

Но насколько это безопасно?

Давайте ответим на этот вопрос через несколько примеров…

return strip_tags("Hello <b>World</b>!")

// Hello World!

✅ Пока все хорошо, она делает то, что должна – удаляет HTML-теги из строк!

return strip_tags("Hello <img src=x onerror=\"alert('Boom!')\"> World!");

// Hello  World!

✅ Как и ожидалось, она удаляет сложные теги тоже.

$string = "Hello <img src=x onerror=\"alert('Boom!')\"> World!";

return strip_tags($string, "<img>"); 

// Hello <img src=x onerror="alert('Boom!')"> World!

❌ К сожалению, она слепо разрешает весь тег, что включает любые XSS-полезные нагрузки. Вы не можете использовать strip_tags() с пользовательским вводом, когда хотите разрешить некоторые теги. Вместо этого вам нужен полнофункциональный HTML Purifier.

$value = strip_tags("' onload=\"alert('Boom!')\" '"); 

return "<input type='text' name='comments' value='{$value}'>";

// <input type='text' name='comments' value='' onload="alert('Boom!')" ''>

❌ Как мы и ожидали, функция не учитывает контекст, хотя она удалит теги, она не ничего не экранирует. Это означает, что использование её внутри атрибутов тегов не безопасно.

Вывод

  • Функция strip_tags() безопасна для использования, когда вы удаляете исключительно HTML-теги из контента, идущего прямо на страницу вне любых атрибутов или сложных HTML-структур.

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


Перевод статьи: https://securinglaravel.com/p/security-tip-is-strip_tags-secure

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

Илья Чубаров (Переводчик)

Активный Laravel участник ✨

1

Вакансии

Спонсоры

Помощь в разработке вашего проекта на Laravel

Независимо от сложности проекта эти кампании помогают сообществу и всем его участникам воплощать идеи в элегантные приложения.

Присоединиться

Инструменты для управления эмоциями, которые помогают людям контролировать свою жизнь и лучше понимать себя.

Перейти

Подкасты c зажигательными эпизодами, которые заставят задуматься и приведут к новым перспективам.

Перейти