Существует ли известная XSS или другая атака, которая
$content = "some HTML code"; $content = strip_tags($content); echo $content;
?
В руководстве есть предупреждение:
Эта функция не изменяет никаких атрибутов в тегах, которые вы разрешаете использовать allowable_tags, включая атрибуты стиля и onmouseover, которые может оскорбительный пользователь может злоупотреблять при публикации текста, который будет показан другим пользователям.
но это связано только с использованием параметра allowable_tags.
Без установленного набора меток strip_tags() уязвим для любой атаки?
Крис Шифлетт, кажется, говорит, что это безопасно:
Использовать зрелые решения
Когда это возможно, используйте зрелые существующие решения вместо того, чтобы пытаться создать свои собственные. Такие функции, как strip_tags () и htmlentities (), являются хорошим выбором.
это верно? Если возможно, укажите источники.
Я знаю про очиститель HTML, htmlspecialchars () и т. Д. Я не ищу лучший метод для дезинфекции HTML. Я просто хочу знать об этой конкретной проблеме. Это теоретический вопрос, который возник здесь .
Ссылка: strip_tags() реализация в исходном коде PHP
Как следует из его названия, strip_tags должен удалить все теги HTML. Единственный способ доказать это – проанализировать исходный код. Следующий анализ применяется к strip_tags('...') , без второго аргумента для белых списков.
Во-первых, некоторая теория о тегах HTML: тег начинается с < сопровождаемого символами без пробелов. Если эта строка начинается с ? , он не должен анализироваться . Если эта строка начинается с символа !-- , это считается комментарием, и следующий текст не должен анализироваться. Комментарий заканчивается с помощью --> , внутри такого комментария допускаются символы типа < и > . Атрибуты могут встречаться в тегах, их значения могут быть дополнительно окружены символом кавычки ( ' или " ). Если такая цитата существует, она должна быть закрыта, иначе, если a > встречается, тэг не закрывается.
Код <a href="example>xxx</a><a href="second">text</a> интерпретируется в Firefox как:
<a href="http://example.com%3Exxx%3C/a%3E%3Ca%20href=" second"="">text</a>
Функция PHP strip_tags в строке 4036 файла ext / standard / string.c . Эта функция вызывает внутреннюю функцию php_strip_tags_ex .
Существуют два буфера, один для вывода, другой для «внутри HTML-тегов». Счетчик с depth держит число угловых скобок ( < ).
Переменная in_q содержит символ кавычки ( ' или " ), если он есть, и 0 противном случае последний символ сохраняется в переменной lc .
Функции содержат пять состояний, три упомянутые в описании выше функции. На основе этой информации и тела функции могут быть получены следующие состояния:
< ) < и ! символов (буфер тега содержит <! ) Нам нужно просто быть осторожным, чтобы ни один тег не мог быть вставлен. То есть, < сопровождается символом без пробелов. Строка 4326 проверяет регистр с символом < который описан ниже:
<a href="inside quotes"> ), символ < игнорируется (удаляется из вывода). < добавляется в выходной буфер . 1 («внутри HTML-тега»), а последний символ lc установлен в < depth увеличивается и символ игнорируется. Если > встречается, когда тег открыт ( state == 1 ), in_q становится 0 («не в цитате»), а state становится 0 («не в теге»). Буфер тега отбрасывается.
Проверки атрибутов (для символов типа ' и " ) выполняются в буфере тегов, который отбрасывается. Таким образом, вывод следующий:
strip_tags без ярлыка тега безопасно для включения внешних тегов, никакой тег не будет разрешен.
Под «внешними тегами» я имею в виду не теги, как в <a href="in tag">outside tag</a> . Текст может содержать < и > хотя, как в >< a>> . Результат недействителен HTML, хотя, < , > и еще нужно избежать, особенно & . Это можно сделать с помощью htmlspecialchars() .
Описание для strip_tags без аргумента whitelist будет:
Уверен, что в возвращаемой строке не существует HTML-тега.
Я не могу предсказать будущие эксплойты, тем более, что я не смотрел исходный код PHP для этого. Тем не менее, в прошлом были эксплойты из-за того, что браузеры принимали, казалось бы, недопустимые теги (например, <s\0cript> ). Поэтому вполне возможно, что в будущем кто-то сможет использовать нечетное поведение браузера.
В стороне, отправляя вывод непосредственно в браузер, поскольку полный блок HTML никогда не должен быть неуверенным:
echo '<div>'.strip_tags($foo).'</div>'
Однако это небезопасно:
echo '<input value="'.strip_tags($foo).'" />';
потому что можно легко закончить цитату через " и вставить обработчик сценария.
Я думаю, что гораздо безопаснее всегда конвертировать бездействующие < в < (и то же самое с кавычками).
Стрип-теги совершенно безопасны – если все, что вы делаете, выводит текст в тело html.
Не обязательно безопасно помещать его в атрибуты mysql или url.
Согласно этому онлайн-инструменту , эта строка будет «отлично» экранирована, но результат будет другим злонамеренным!
<<a>script>alert('ciao');<</a>/script>
В строке «реальные» теги <a> и </a> , так как только < и script> не являются тегами.
Надеюсь, я ошибаюсь или что это просто из-за старой версии PHP, но лучше проверить свою среду.