Конечно, это не глупый вопрос, он очень действительный. Позвольте мне попытаться разобраться в нескольких вещах.
Решение для XSS - это выходное кодирование. Это означает кодирование специальных символов при записи переменных на страницу в соответствии с контекстом, на который они записываются. Для контекста html (текст между тегами html или значения атрибутов тега между кавычками) это html-кодировка, но для контекста Javascript (при записи переменных между тегами скриптов в html или в атрибутах событий, например onclick), это должен быть Javascript (строка).
ничего, кроме собственно вывода кодирование всех переменных будет препятствовать XSS в общем случае (Sidenote: статический и надежный контент не должен быть закодировано, но этот уровень детализации не поместился бы в ответе здесь) ,
Сказав это, существуют другие меры защиты, в зависимости от того, какую среду вы используете, что может помочь в некоторых конкретных сценариях. Однако вы не должны полагаться исключительно на них, но они хороши для дополнительных линий защиты.
Одна такая защита встроена в браузеры. Если браузер обнаруживает, что в запросе одним из параметров был Javascript, а затем тот же Javascript отражается на результирующей странице, какой-то браузер фактически не запускает это, потому что это очевидная форма отраженного XSS. Это поведение контролируется X-XSS-Protection response header, в последних браузерах вы можете включить или выключить его. Проблема в том, что недостаточно. Например, он эффективен только для отраженного XSS, когда Javascript с запросом отражается обратно в ответ. Он может храниться в базе данных после ввода и записываться в разные ответы приложения (хранимый XSS), и в этом случае защита бесполезна.Кроме того, многие защиты от атак («способы использования XSS») не обнаруживаются защитой браузера, особенно когда вход записывается в контекст Javascript. Имейте в виду, что поскольку эта защита является функцией браузера, она специфична для браузера, разные браузеры могут вести себя по-разному.
Также обратите внимание, что могут быть другие защитные меры, например, .NET налагает проверку запроса на фильтрацию вредоносного ввода, а также автоматическое кодирование вывода для html-контекста, но даже эти средства вместе с защитой браузера не достаточны для предотвратить XSS. Как было сказано выше, XSS является проблемой кодирования вывода, ничто не может предотвратить его (за исключением, может быть, в некоторых особых случаях). И тогда я даже не упомянул DOM XSS, который представляет собой совершенно другой класс подобных проблем, но в этом ответе я хотел сосредоточиться на защите, встроенной в браузер, и на контекст, где это работает.
Благодарим вас за подробное объяснение. Если вы говорите, что проверка запроса и вывода запросов .NET для HTML-контекста + защита браузера недостаточно, в этом конкретном случае я предполагаю, что вы говорите, что необходима также кодировка вывода для контекста JavaScript. – Uebyn
Точно, например. '@ HttpUtility.JavaScriptStringEncode()' или более безопасный 'System.Web.Security.AntiXss.AntiXssEncoder'. И тогда есть также [DOM XSS] (https://www.owasp.org/index.php/DOM_Based_XSS), который можно предотвратить в Javascript, только вставляя пользовательский ввод непосредственно на страницу DOM в виде текстовых узлов (практически это означает использование jQuery '.text()' вместо '.html()', привязка 'text' нокаута вместо' html' и т. д.). –
Имеет смысл - но если вы хотите, чтобы пользователь вводил теги HTML и выводил их теги HTML (например, на сайтах вроде SO)? Вы будете кодировать их вход, а затем декодировать его при выводе в HTML? – Uebyn