Рули встроены в безопасное место? - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть шаблон руля, работающий на стороне клиента, который отображает переменные внутри встроенного клика, например:

<script id="my-handlebars-template" type="text/x-handlebars-template">
    <button onclick="console.log('{{name}}');">Click Me!</button>
</script>

Контекст для этого шаблона руля происходит из вызова ajax. name было введено пользователем на экране входа. Мой вопрос: может ли кто-нибудь начать атаку xss, изменив свое имя на какую-то вредоносную последовательность символов? Например, если name было );alert('hello, будет ли шаблон руля запускать предупреждение? Из моего тестирования, это так. Это просто невероятно легко написать небезопасный код.

Вот jsfiddle с тестом. Обратите внимание, как запускается оповещение при нажатии на ссылку );alert('hello. http://jsfiddle.net/68tme0hr/1/

1 Ответ

1 голос
/ 07 февраля 2020

Мой вопрос: может ли кто-нибудь начать атаку xss, изменив свое имя на какую-то вредоносную последовательность символов?

Да. Выход из руля защищает только HTML.

Если вы уже в JS, то вы уязвимы.

Существует два основных подхода c для решения этой проблемы.

Escape JavaScript data

Передайте данные через JSON.stringify, прежде чем поместить их в JS. Движок JS будет обрабатывать его как литерал.

Обратите внимание, что для строк добавляются кавычки, вам не нужно это делать

onclick="console.log({{name_after_json_stringify}});">

Поместите данные где-то безопаснее, чем в середине JS

, например, в атрибуте data-*

onclick="console.log(this.dataset.name);" data-name="{{name}}">

Я рекомендую второй из этих подходов, так как он проще и более читаемым.

...