экранирование html/XSS при вводе и выводе

Из всего, что я видел, кажется, что соглашение об экранировании html для вводимого пользователем контента (в целях предотвращения XSS) заключается в том, чтобы делать это при рендеринге контента. Большинство языков шаблонов, кажется, делают это по умолчанию, и я сталкивался с такими вещами, как этот ответ stackoverflow, утверждающий, что эта логика является работой уровня представления.

Итак, мой вопрос: почему это так? Мне кажется чище экранировать ввод (т.е.форма или проверка модели), поэтому вы можете работать, исходя из предположения, что все в базе данных безопасно для отображения на странице по следующим причинам:

  1. Разнообразие выходных форматов — для современного веб-приложения вы можете использовать комбинацию рендеринга html на стороне сервера, веб-приложение javascript, использующее ajax/JSON, и мобильное приложение, которое получает JSON (и которое может иметь или не иметь некоторые веб-представления, которые могут быть приложениями javascript или отображаемым на сервере html). Таким образом, вам приходится иметь дело с экранированием html повсюду. Но ввод всегда будет создаваться как модель (и проверяться) перед сохранением в БД, и все ваши модели могут наследоваться от одного и того же базового класса.

  2. Вы уже должны быть осторожны с вводом, чтобы предотвратить атаки с внедрением кода (при условии, что это обычно абстрагируется от курсора ORM или db, но все же), так почему бы также не беспокоиться об экранировании html здесь, чтобы вам не пришлось беспокоиться о чем-либо, связанном с безопасностью на выходе?

Я хотел бы услышать аргументы в пользу того, почему экранирование html при рендеринге страницы предпочтительнее

24
задан Community 23 May 2017 в 12:17
поделиться