PHP не игнорирует html-теги

#php #strip-tags

#php #strip-теги

Вопрос:

У меня есть поле ввода, в которое пользователь ввел строку, подобную

  "/> <img src=xxx onError=alert('test is here')
  

но во время я использовал функцию strip_tags перед сохранением значения в базе данных. Он удаляет тег изображения, но строка «/> сохраняется в базе данных как есть.

Как я могу справиться с этим.

Комментарии:

1. Потому что это недопустимый HTLM / XML. Почему закрывающий тег написан раньше?

2. Чего вы пытаетесь достичь? Это в целях безопасности или потому, что вы действительно хотите извлечь текст из html? Если это первое, вам могло бы быть лучше с помощью кодирования / декодирования, если это последнее, вы можете захотеть использовать синтаксический анализатор вместо этого.

3. Чего именно вы пытаетесь достичь? Тег удален, как и должна делать функция (даже если он не закрыт). Другая «вещь» "/> не является HTML-тегом.

4. xss-атака, я думаю

5. используйте htmlspecialchars() php.net/manual/en/function.htmlspecialchars.php

Ответ №1:

Честно говоря, здесь, к сожалению, нет единого решения.

Функция strip_tags хорошо работает на хорошо отформатированном HTML, и ваш пример не является допустимым.

Один из ваших вариантов — написать пользовательский код, который «очищает» входные данные в зависимости от их природы. Например, если при вводе должен быть указан чей-то возраст, удалите все, что не является цифрой. Вы можете сделать то же самое для имен, телефонов и т.д. и т.п.

Конечно, мы, как разработчики, не можем предусмотреть всю возможную бессмыслицу, которую пользователь может ввести (специально или нет), и иногда мы получаем такие данные в БД. Вот почему всегда рекомендуется избегать данных перед их печатью в HTML. Все существующие фреймворки и шаблонизаторы уже делают это за вас. Если вы не используете фреймворк, вы можете использовать функцию htmlentities — http://php.net/manual/en/function.htmlentities.php.

htmlentities сохранит любые зарезервированные символы HTML и не приведет к разрыву страницы. Например:

 htmlentities("/> <img src=xxx onError=alert('test is here')");
  

привело бы к:

 /amp;> amp;<img src=xxx onError=alert('test is here')
  

И после рендеринга через браузер это будет выглядеть как:

введите описание изображения здесь

Комментарии:

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