Как следует из названия, strip_tags
должен удалить все теги HTML.Единственный способ доказать это - проанализировать исходный код.Следующий анализ относится к вызову strip_tags('...')
без второго аргумента для тегов из белого списка.
Прежде всего, немного теории о тегах HTML: тег начинается с <
, за которым следуют непробельные символы.Если эта строка начинается с ?
, ее не следует анализировать .Если эта строка начинается с !--
, она считается комментарием, и следующий текст не должен анализироваться.Комментарий заканчивается символом -->
, внутри такого комментария допускаются символы типа <
и >
.Атрибуты могут присутствовать в тегах, их значения могут быть заключены в кавычки ('
или "
).Если такая цитата существует, она должна быть закрыта, в противном случае, если встречается >
, тег не закрывается.
Код <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
.
. Функции содержат пять состояний, три из которых упоминаются в описании над функцией.На основе этой информации и тела функции могут быть получены следующие состояния:
- Состояние 0 - это выходное состояние (отсутствует в любом теге)
- Состояние 1 означает, что мы находимся внутриобычный HTML-тег (буфер тегов содержит
<
) - Состояние 2 означает, что мы находимся внутри тега php
- Состояние 3: мы вышли из состояния вывода и столкнулись с
<
и !
символов (буфер тегов содержит <!
) - Состояние 4: внутри HTML-комментария
Нам просто нужно быть осторожным, чтобы никакой тег не мог быть вставлен.То есть <
, за которым следует непробельный символ. Строка 4326 проверяет регистр с символом <
, который описан ниже:
- Если внутри кавычек (например,
<a href="inside quotes">
), символ <
игнорируется (удаляетсяиз вывода). - Если следующий символ является пробелом,
<
добавляется в выходной буфер . - , если вне тега HTML, состояниестановится
1
(«внутри HTML-тега»), а последний символ lc
устанавливается на <
- В противном случае, если внутри тега HTML счетчик с именем
depth
увеличивается, а символигнорируется.
Если при открытом теге встречается >
(state == 1
), in_q
становится 0
("не в кавычках") и state
становится 0
(«не в теге»). Буфер тегов отбрасывается.
Проверка атрибутов (для таких символов, как '
и "
) выполняется в буфере тегов, который отбрасывается.Итак, вывод таков:
strip_tags без белого списка тегов безопасен для включения вне тегов, никакие теги не допускаются.
Под "внешними тегами" я имею в виду нев тегах как в <a href="in tag">outside tag</a>
.Текст может содержать <
и >
, как, например, >< a>>
.Результатом является недопустимый HTML, однако, <
, >
и &
все еще необходимо экранировать, особенно &
.Это можно сделать с помощью htmlspecialchars()
.
Описание для strip_tags
без аргумента белого списка будет выглядеть следующим образом:
Убедитесь, что тег HTML не существуетв возвращаемой строке.