работа с входными данными пользователя в php.Что лучше?

StackOverflow https://stackoverflow.com/questions/1820754

  •  10-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь выяснить, как лучше всего управлять данными, которые пользователь вводит относительно нежелательных тегов, которые он может вставить:

  • Strip_tags() - теги удаляются и в базу данных не вставляются
  • теги вставляются в базу данных, но при чтении этого поля и отображении его пользователю мы будем использовать htmlspecialchars()

Что лучше и есть ли какие-либо недостатки в любом из них?

С уважением

Это было полезно?

Решение

Это зависит от вашего приоритета:

  • если важно отображать специальные символы из пользовательского ввода (например, в StackOverflow), тогда вам нужно будет хранить эту информацию в базе данных и очищать ее при отображении - в этом случае вам нужно как минимум использовать htmlspecialchars() для отображения вывода (если не что-то более сложное)
  • если вам просто нужны текстовые комментарии, используйте strip_tags() перед тем, как засунуть его в базу данных - таким образом вы уменьшите объем данных, которые необходимо хранить, и уменьшите время обработки при отображении данных на экране

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

теги вставляются в базу данных, но при чтении этого поля и отображении его пользователю мы будем использовать htmlspecialchars()

Этот.Обычно вы хотите, чтобы люди могли вводить знаки «меньше» и амперсанды и отображать их как таковые на странице. htmlspecialchars на каждом этапе вывода текста в HTML (независимо от того, поступил ли этот текст непосредственно из пользовательского ввода, из базы данных или откуда-то еще) — это правильный способ добиться этого.Возиться с вводом — совершенно неподходящая тактика для решения проблемы кодирования вывода.

Конечно, вам понадобится другой escape- или параметризация - для помещения текста в SQL нить.

Меры, принимаемые для защиты ввода данных пользователем, полностью зависят от того, в каком контексте используются данные.Например:

  • Если вы вставляете его в базу данных SQL, вам следует использовать параметризованные операторы.PHP mysql_real_escape_string() работает тоже прилично.
  • Если вы собираетесь отображать его на странице HTML, вам необходимо удалить или экранировать теги HTML.
  • В общем, каждый раз, когда вы смешиваете пользовательский ввод с другой формой разметки или другим языком, элементы этого языка необходимо экранировать или удалять из ввода, прежде чем помещать в этот контекст.

Последний пункт выше переходит в следующий пункт:Многие считают, что исходный ввод всегда следует сохранять.Это имеет большой смысл, когда позже вы решите использовать данные по-другому и, например, HTML-теги не будут иметь большого значения в новом контексте.Кроме того, если ваш сайт каким-либо образом скомпрометирован, у вас есть запись точных введенных данных.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top