У меня есть система, которая позволяет пользователям вводить зарезервированные символы HTML в текстовую область, а затем публиковать это в моем приложении.Затем эта информация сохраняется в базе данных для последующего поиска и отображения.Тревоги (должны быть) у вас в голове.Мне нужно убедиться, что я избегаю XSS-атак, потому что я буду отображать эти данные где-то еще в приложении.Вот мои варианты, как я это вижу:
Кодирование перед сохранением в БД
Я могу HTML-кодировать данные при входе в базу данных, поэтому символы HTML никогда не вводятся вбаза данных.
Плюсы:
- Разработчикам не нужно помнить, чтобы HTML кодировал данные при их отображении на веб-странице.
Минусы:
- Данные теперь не имеют смысла для настольных приложений (или для чего-либо другого, кроме HTML).Материал отображается как
< > &
и т. Д.
Не кодируйте HTML перед сохранением в БД
Я могу HTML-кодировать данные всякий раз, когда мне нужно отобразить их на веб-странице.
Плюсы:
- Чувствуется правильно, поскольку он сохраняет целостность данных, введенных пользователем.
- Допускает не-HTMLприложения на основе просто отображать эти данные, не беспокоясь о кодировке HTML.
Минусы:
- Мы можем отображать эти данные во многих местах, и мы будемубедитесь, что каждый разработчик знает, что при отображении этого поля вам нужно будет его кодировать в формате HTML.
- Люди забывают о вещах.Будет, по крайней мере, один случай, когда мы забудем HTML-кодирование данных.
Очистите данные перед сохранением в БД (не кодируйте HTML)
Я могу использовать колодецпроверенная сторонняя библиотека для удаления потенциально опасного HTML и получения безопасного фрагмента HTML для сохранения базы данных, а не в кодировке HTML.
Плюсы:
- Сохраняет большую часть исходного ввода, так чтоОтображение в формате, отличном от HTML, имеет смысл.
- Менее катастрофично, если разработчик забудет HTML-кодирование этой информации для отображения на веб-странице.
Минусы:
- По-прежнему портит данные, так как пользователь их изначально вводил.Если они действительно хотят ввести тег
<script>
или <object>
, он этого не сделает, и из-за этого мы получим звонки в службу поддержки и электронные письма.
Мой вопрос: чтоэто лучший вариант, или, если есть другой способ, что это?