Безопасна ли функция `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
Еще что нибудь почитать? тогда присоединяйся в нашу ламповую компанию в телеге