Из всего, что я видел, похоже, что соглашение об экранировании html на введенном пользователем контенте (с целью предотвращения XSS) заключается в том, чтобы делать это при рендеринге контента. Большинство языков шаблонов, похоже, делают это по умолчанию, и я сталкивался с такими вещами, как qaru.site/info/247276/..., утверждая, что эта логика является заданием уровня представления.
Итак, мой вопрос: почему это так? Для меня кажется, что на входе (например, в форме или модели) вы можете избежать выхода, так что вы можете работать в предположении, что что-либо в базе данных безопасно отображать на странице по следующим причинам:
-
Разнообразие форматов вывода - для современного веб-приложения вы можете использовать комбинацию html-рендеринга на стороне сервера, веб-приложение javascript с использованием ajax/JSON и мобильного приложения, которое получает JSON (и которое может или может не иметь некоторых веб-просмотров, которые могут быть приложениями javascript или обработанными сервером html). Таким образом, вам нужно иметь дело с html, убегающим повсюду. Но вход всегда будет создан как модель (и проверен) до сохранения в db, и ваши модели могут наследовать один и тот же базовый класс.
-
Вам уже нужно быть осторожным в отношении ввода, чтобы предотвратить атаки с использованием кода (при условии, что это обычно абстрагируется с ORM или курсором db, но все же), поэтому почему бы и не беспокоиться о том, что html не работает здесь, t нужно беспокоиться о чем-либо связанном с безопасностью на выходе?
Мне бы хотелось услышать аргументы о том, почему предпочтительнее использовать html-экранирование на странице.