#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. да .. именно.. этого не должно быть .. в этом случае строка не должна сохраняться в базе данных..