У меня есть поле ввода, в котором пользователь ввел строку, например
"/> <img src=xxx onError=alert('test is here')
но во время я использовал функцию strip_tags перед сохранением значения в базе данных. Он игнорирует тег изображения но, строка "/> сохраняется в базе данных как есть.
Как мне с этим побороться.
Чего вы пытаетесь достичь? Это в целях безопасности или потому что вы действительно хотите извлечь текст из html? Если это первое, вам лучше использовать кодирование/декодирование, если это последнее, вы можете вместо этого использовать синтаксический анализатор.
Чего именно вы пытаетесь достичь? Тег разделяется, как и должна делать функция (даже если он не закрыт). Другая «вещь» "/> не является HTML-тегом.
xss атака я думаю
Какая строка точный осталась? Пожалуйста, поделитесь примером кода, входными данными, текущими и ожидаемыми результатами.
использовать htmlspecialchars() php.net/manual/en/function.htmlspecialchars.php
да.. это атака xss.. хочу побороть с этим
Я хочу сохранить текст только из строки (что бы это ни было)
@u_mulder означает?
Вы можете экранировать его с помощью htmlспециальные символы, чтобы он отображался, например, как <input value = ""/>">
если я использую htmlspecialchars, он сохраняет значение типа ""/> <img src=xxx onError=alert('test is here')" как есть
Не совсем понятно, что вы спрашиваете. Вы привели один пример того, что вам не нравится, но не объяснили. Ваше описание «сохранить только текст» не очень помогает, "/>является текст. Что вы на самом деле хотите раздеть? Что-то, что не является буквой или цифрой? (Поэтому запрещены любые знаки препинания). Что-нибудь, что не является словарным словом? (Поэтому без имен людей). Точная последовательность из трех символов?
В качестве отступления вам следует сделать шаг назад и взглянуть на проблему, которую вы пытаетесь решить, в первую очередь удаляя контент из представленных материалов, и спросить себя, действительно ли это служит этой цели.






Честно говоря, здесь, к сожалению, нет единого решения.
Функция strip_tags хорошо работает с хорошо отформатированным HTML, и ваш пример не является допустимым.
Один из вариантов — написать собственный код, который «очищает» ввод в зависимости от его характера. Например, если ввод должен собирать чей-то возраст, удалите все, что не является цифрой. Вы можете сделать то же самое для имен, телефонов и т.д. и т.п.
Конечно, мы, как разработчики, не можем предусмотреть всю возможную ерунду, которую пользователь может ввести (намеренно или нет), и иногда мы оказываемся с такими данными в БД. Вот почему всегда полезно экранировать данные перед их печатью в HTML. Все существующие фреймворки и шаблонизаторы уже делают это за вас. Если вы не используете фреймворк, вы можете использовать функцию htmlсущности — http://php.net/manual/en/function.htmlentities.php.
htmlсущности сохранит любые зарезервированные символы HTML и не сломает вашу страницу. Например:
htmlentities("/> <img src=xxx onError=alert('test is here')");
приведет к:
/> <img src=xxx onError=alert('test is here')
И после рендеринга через браузер это будет выглядеть так:
да..точно.. этого не должно быть.. строка не должна быть сохранена в базе данных в этом случае..
Потому что это недопустимый HTLM/XML. Почему закрывающий тег пишется раньше?