PHP htmlentities () на входе до вставки БД, а не на выходе

Интересно, есть ли недостатки или плохая практика при выполнении следующей процедуры:

  1. $ user_input -> htmlentities ($ user_input) -> mysql_escape ($ user_input) -> вставить $ user_input в DB
  2. Выберите $ user_input из DB -> echo $ user_input

вместо того, чтобы делать следующее:

  1. $ user_input -> mysql_escape ($ user_input) -> вставить $ user_input в DB
  2. Выберите $ user_input из DB -> echo htmlentities ($ user_input)

Поскольку мы показываем тот же самый $ user_input во многих местах, он чувствует себя более эффективно, делая это на входе вместо этого, есть ли недостатки / плохая практика / эксплойт-способность в этом так?

Ура!

Хорошие ответы на вопрос:

@Matt: В общем, чтобы сохранить читаемость и сопровождение, попробуйте сохранить его как можно ближе к оригинальному, нефильтрованному контенту. Это зависит от двух вещей: будет ли какой-либо другой человек / программа ссылаться на эти данные? Нужно ли легко редактировать данные?

@Sjoerd: существует недостаток, если вы хотите отображать данные как нечто иное, чем HTML, например, CSV-загрузку, PDF и т. Д.

Это зависит от двух вещей:

  • Будет ли какой-либо другой человек / программа ссылаться на эти данные?
  • Нужно ли легко редактировать данные?

Преимущество метода 1 заключается в том, что в случае, когда данные используются в одном месте , и htmlentities() будет вызываться каждый раз, вы сохраните этот шаг.

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

На самом деле, вы можете обнаружить, что HTML – это не то, что нужно хранить в любом случае. Возможно, лучше сохранить что-то вроде Markdown и просто преобразовать его в HTML при просмотре.

Я бы советовал против этого. Если вам когда-либо понадобится эти данные для чего-либо другого, кроме отображения его в виде HTML (отображение на консоли, отправка текстового сообщения, запись в журнал и т. Д.), Вам придется его вернуть.

Хорошей практикой является применение таких преобразований только в последний момент. Используйте mysql_escape перед вставкой в ​​базу данных, используйте htmlentities (или htmlspecialchars) перед отображением в виде HTML. Таким образом, вы всегда знаете, где должны быть ваши функции побега. Если их там нет, вы можете легко сказать, что делаете что-то неправильно. Вы также знаете, что данные в базе данных всегда чисты, и вам не нужно помнить, закодировали ли вы их, как и как их вернуть.

Существует недостаток, если вы хотите отображать данные как нечто иное, чем HTML, например, CSV-загрузку, PDF и т. Д.