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

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

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

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

Как мне с этим побороться.

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

Kévin Bibollet 08.03.2019 11:13

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

Federico klez Culloca 08.03.2019 11:14

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

ArSeN 08.03.2019 11:14

xss атака я думаю

Romain B. 08.03.2019 11:15

Какая строка точный осталась? Пожалуйста, поделитесь примером кода, входными данными, текущими и ожидаемыми результатами.

Nico Haase 08.03.2019 11:17

использовать htmlspecialchars() php.net/manual/en/function.htmlspecialchars.php

Nadeem Shaikh 08.03.2019 11:17

да.. это атака xss.. хочу побороть с этим

Mangesh 08.03.2019 11:17
экранирование вывода — это ключ.
u_mulder 08.03.2019 11:18

Я хочу сохранить текст только из строки (что бы это ни было)

Mangesh 08.03.2019 11:18

@u_mulder означает?

Mangesh 08.03.2019 11:19

Вы можете экранировать его с помощью htmlспециальные символы, чтобы он отображался, например, как <input value = "&quot;/&gt;">

Thum Choon Tat 08.03.2019 11:24

если я использую htmlspecialchars, он сохраняет значение типа ""/> <img src=xxx onError=alert('test is here')" как есть

Mangesh 08.03.2019 11:27

Не совсем понятно, что вы спрашиваете. Вы привели один пример того, что вам не нравится, но не объяснили. Ваше описание «сохранить только текст» не очень помогает, "/>является текст. Что вы на самом деле хотите раздеть? Что-то, что не является буквой или цифрой? (Поэтому запрещены любые знаки препинания). Что-нибудь, что не является словарным словом? (Поэтому без имен людей). Точная последовательность из трех символов?

Quentin 08.03.2019 11:27

В качестве отступления вам следует сделать шаг назад и взглянуть на проблему, которую вы пытаетесь решить, в первую очередь удаляя контент из представленных материалов, и спросить себя, действительно ли это служит этой цели.

Quentin 08.03.2019 11:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
14
74
1

Ответы 1

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

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

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

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

htmlсущности сохранит любые зарезервированные символы HTML и не сломает вашу страницу. Например:

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

приведет к:

/&gt; &lt;img src=xxx onError=alert('test is here')

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

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

Mangesh 08.03.2019 11:32

Другие вопросы по теме