Подтвердить что ты не робот

Это плохая идея избежать HTML перед вставкой в ​​базу данных, а не после вывода?

Я работал над системой, которая не позволяет форматировать HTML. Метод, который я использую в настоящее время, заключается в том, чтобы исключить объекты HTML, прежде чем они будут вставлены в базу данных. Мне сказали, что я должен вставить исходный текст в базу данных и вывести объекты HTML на выходе.

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

4b9b3361

Ответ 1

вы также ограничите себя при выполнении экранирования перед вставкой в ​​свой db. скажем, вы решили не использовать HTML в качестве вывода, а JSON, открытый текст и т.д.

если вы сохранили escaped html в своем db, вам сначала нужно "unescape" значение, хранящееся в db, просто чтобы снова убрать его в другой формат.

также см. эту прекрасную статью owasp по предотвращению xss

Ответ 2

Да, потому что на каком-то этапе вам нужен доступ к введенному исходному вводу. Это потому, что...

  • Вы никогда не знаете, как вы хотите отображать его - в JSON, в HTML, в виде SMS?
  • Вам может потребоваться показать его пользователю как есть.

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

3<4 :->

Они получат только 3, если это регулярное выражение.

Ответ 3

Я обычно храню обе версии текста. Текст с экранированным/отформатированным текстом используется, когда выполняется обычный запрос страницы, чтобы избежать накладных расходов на экранирование/форматирование каждый раз. Исходный/необработанный текст используется, когда пользователю необходимо редактировать существующую запись, а экранирование/форматирование происходит только при создании или изменении текста. Эта стратегия отлично работает, если у вас нет жестких ограничений пространства для хранения, поскольку вы будете дублировать данные.

Ответ 4

  • Еще одна неуловимая проблема: предположим, что вы вводите запись со строкой R&B в названии. Он будет сохранен как R&amp;B. И предположим, что у нас есть функция поиска, которая использует SQL:

    $query = $database->prepare('SELECT * FROM table WHERE title LIKE ?');
    $query->execute(array($searchString.'%'));    
    

    Теперь, если кто-то ищет R&B, он не будет соответствовать этой строке, поскольку он хранится как R&amp;B. Ситуация одинакова для равенства, сортировки и т.д.

    Конечно, здесь возникает проблема не искать HTML-теги, так как <span> будет соответствовать, если кто-то ищет span. Это можно решить, делегируя функциональность поиска какой-либо внешней службе, такой как Solr, или сохраняя версию во втором поле, которое очищается от HTML-тегов, специальных символов и т.д. (Для полнотекстового поиска), аналогичного предложению @limscoder.

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

  • Несколько месяцев спустя присоединяется новый член команды. Как хорошо обученный разработчик, он всегда использует html-экранирование, теперь только для того, чтобы увидеть, что все двойное экранирование (например, есть заголовки, отображаемые как He said &quot;nuff&quot; вместо He said "nuff").

  • Стиль цитаты htmlspecialchars() (например, ENT_QUOTES, ENT_COMPAT и т.д.) будет укусить вас, если вы используете что-то другое, кроме значения по умолчанию, и забудьте использовать тот же стиль цитирования в обоих хранилищах/вывода.

    Аналогичная проблема возникает, если вы используете htmlentities() для хранения и htmlspecialchars() для вывода или наоборот (с соответствующими встречными функциями). Ваш HTML будет загрязнен с помощью &Uuml; s, &Ccedil; и т.д.

    Они более подвержены злоупотреблениям, если несколько разработчиков работают на одной и той же базе кода.