Сохранение свойства с помощью HTML - кодирование при вводе или при отображении? - PullRequest
5 голосов
/ 01 декабря 2010

У меня есть система, которая позволяет пользователям вводить зарезервированные символы HTML в текстовую область, а затем публиковать это в моем приложении.Затем эта информация сохраняется в базе данных для последующего поиска и отображения.Тревоги (должны быть) у вас в голове.Мне нужно убедиться, что я избегаю XSS-атак, потому что я буду отображать эти данные где-то еще в приложении.Вот мои варианты, как я это вижу:

Кодирование перед сохранением в БД

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

Плюсы:

  • Разработчикам не нужно помнить, чтобы HTML кодировал данные при их отображении на веб-странице.

Минусы:

  • Данные теперь не имеют смысла для настольных приложений (или для чего-либо другого, кроме HTML).Материал отображается как < > & и т. Д.

Не кодируйте HTML перед сохранением в БД

Я могу HTML-кодировать данные всякий раз, когда мне нужно отобразить их на веб-странице.

Плюсы:

  • Чувствуется правильно, поскольку он сохраняет целостность данных, введенных пользователем.
  • Допускает не-HTMLприложения на основе просто отображать эти данные, не беспокоясь о кодировке HTML.

Минусы:

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

Очистите данные перед сохранением в БД (не кодируйте HTML)

Я могу использовать колодецпроверенная сторонняя библиотека для удаления потенциально опасного HTML и получения безопасного фрагмента HTML для сохранения базы данных, а не в кодировке HTML.

Плюсы:

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

Минусы:

  • По-прежнему портит данные, так как пользователь их изначально вводил.Если они действительно хотят ввести тег <script> или <object>, он этого не сделает, и из-за этого мы получим звонки в службу поддержки и электронные письма.

Мой вопрос: чтоэто лучший вариант, или, если есть другой способ, что это?

1 Ответ

4 голосов
/ 01 декабря 2010

Правильно - не искажать / не изменять пользовательский ввод.

Итак, не не кодирует перед сохранением.

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

...