XSS предотвращение для параметров, передаваемых в файл кода JS

У меня есть следующий поток: URL с параметрами запроса, который запускает некоторую логику на стороне сервера, а затем генерирует с помощью шаблонизатора заглушку HTML-страницу с

  • Включен файл JavaScript, который выполняет основную логику.
  • <script> тег, который включает в себя объект JS, имеющий параметры для этого кода JS, частично взятые из параметров запроса ранее.

Теперь я хочу санировать полученные параметры, чтобы предотвратить инъекцию XSS. Проблема в том, что одним из параметров является токен, поэтому я не хочу быть слишком строгим по отношению к проверкам (просто не допускается, чтобы все возможные символы XSS звучали слишком строго), но большинство библиотек, с которыми я столкнулся, имеют дело с чистый HTML, а не код JS (в пределах <script> тег). Я также чувствую себя немного неловко, когда я читаю все решения регулярных выражений, потому что я привык доверять библиотекам с открытым исходным кодом при работе с безопасностью (которые имеют модульные тесты, а не кучу регулярных выражений).

Любой совет по библиотекам и возможному подходу? Мы работаем в среде JVM.

2 ответа

Решение

Самый простой, простой и, следовательно, более безопасный подход заключается в использовании атрибутов данных для представления динамических значений, предоставленных пользователем.

Таким образом, вам нужно беспокоиться только о кодировке HTML, а не о сложной шестнадцатеричной кодировке сущности (\x00) что рекомендую OWASP.

Например, вы могли бы иметь:

<body data-token="@param.token" />

куда @param.token выведет HTML-версию параметра строки запроса. например page?token=xyz" будет выводить

<body data-token="xyz&quot;" />

Это уменьшит вашу проблему с уязвимостью XSS.

Затем вы можете использовать что-то вроде JQuery, чтобы легко получить значения атрибутов данных в вашем JavaScript:

var token = $("body").data("token");

Просто и безопасно.

Imagining you want to assign your parameter as a string, as such:

{
  ...
  x: '[PARAMETER]'
}

You want to make sure that [PARAMETER] does not break out of the quoted string.

In this case what you need to escape is the ' character and the closing </script>тег. Note: take into consideration "escape-the-escape" attacks, where the attacker sends the string \', which is escaped as \\', which turns back to ' (and you are back from where you started).

It's generally simply safer, as OWASP notes, to

escape all characters less than 256 with the \xHH format

I invite you to read the OWASP page on XSS attacks, and in particular https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

Другие вопросы по тегам