2016-11-19 1 views
1

Я тестируя XSS в браузерах, используя этот очень простой тест:атаки XSS на EJS Страницы предотвращен на всех браузерах, но Firefox

  1. Страница работает на Экспресс + EJS
  2. На маршрутах/индекс .js, я установил ниже, чтобы получить ключевое слово запроса значение строки:

app.get('/search', function(req, res) { res.render('../views/pages/index', { title: req.query.keyword }); });

<ол начать = "3">
  • index.ejs страница затем принимает переменное название и делает его таким: <h1><%- title %></h1> (. Обратите внимание, что я не избежать переменного заголовка)
  • Когда я скопировать следующий URL (http://localhost:3001/search?keyword=%3Cimg%20src%3D%22private%2Fdist%2Flogo.png%22%20onerror%3D%22window.location%3D%27http%3A%2F%2Fgoogle.com%27%22%20%2F%3E), интересно каждый браузер я тестировал (Chrome, Opera, Safari, IE8), но Firefox дает предупреждение о том, что они отказываются выполнять сценарий.
  • Так что, я думаю, вопрос заключается в том, что если разработчик случайно не сможет избежать строки, как в этом случае, и все браузеры, но Firefox поймают это, то у Firefox возникла проблема с выполнением аудита XSS? Правильно ли я предположить это?

    Кроме того, могу ли я предположить, что в качестве разработчиков мы должны всегда escape-значения, передаваемые из URL-адреса или сервера?

    Заранее благодарим за ваши советы и прошу прощения, если я задаю глупые вопросы - только начал изучать эту вещь XSS.

    ответ

    1

    Конечно, это не глупый вопрос, он очень действительный. Позвольте мне попытаться разобраться в нескольких вещах.

    Решение для 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, который представляет собой совершенно другой класс подобных проблем, но в этом ответе я хотел сосредоточиться на защите, встроенной в браузер, и на контекст, где это работает.

    +0

    Благодарим вас за подробное объяснение. Если вы говорите, что проверка запроса и вывода запросов .NET для HTML-контекста + защита браузера недостаточно, в этом конкретном случае я предполагаю, что вы говорите, что необходима также кодировка вывода для контекста JavaScript. – Uebyn

    +0

    Точно, например. '@ 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' и т. д.). –

    +0

    Имеет смысл - но если вы хотите, чтобы пользователь вводил теги HTML и выводил их теги HTML (например, на сайтах вроде SO)? Вы будете кодировать их вход, а затем декодировать его при выводе в HTML? – Uebyn

    Смежные вопросы