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"" />
Это уменьшит вашу проблему с уязвимостью 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