Как я могу включить серверные переменные в JS с помощью CSP?

В моем приложении у меня есть некоторые серверные переменные:

{{# serverVars }}
    <script>
        window.serverVars = {{{ . }}};
    </script>
{{/ serverVars }}

Это используется для установки, например, window.serverVars.countryCode в код страны, как определено сервером с использованием геоIP.

Сейчас в CSP это считается unsafe-inline что вообще плохо. Итак, каков наилучший подход:

  • Использовать одноразовый номер сложно: одноразовый номер уникален для каждого запроса, и большинство библиотек CSP (например, Helmet) считают политики CSP статическими.
  • Использование хеша затруднено: значение serverVars уникально для каждого запроса, и большинство библиотек CSP (например, Helmet) считаются CSP. политики статичны
  • unsafe-inline для script-src считается небезопасным

Как лучше всего добавить динамические серверные переменные в клиентский JavaScript с помощью CSP?


person mikemaccana    schedule 23.08.2015    source источник


Ответы (2)


Я видел, как некоторые люди используют script с type, которые браузер не будет выполнять, а затем извлекают и анализируют их из доверенного JavaScript. Например, в HTML:

<script id="config" type="application/x-configuration">
    {"environment": "production", ...}
</script>

А затем в вашем файле JavaScript:

var config = JSON.parse(document.getElementById('config').textContent);

Вы также можете поместить его как атрибут data, если хотите, например:

<!DOCTYPE html>
<html lang="en" data-config="{&quot;environment&quot;: &quot;production&quot;, ...}">
    ...

И снова получаем его в своем JavaScript:

var config = JSON.parse(document.documentElement.dataset.config);
person icktoofay    schedule 23.08.2015
comment
Разве это не будет считаться встроенным скриптом, даже если это type="application/x-configuration"? - person mikemaccana; 23.08.2015
comment
@mikemaccana: я признаю, что не очень хорошо знаком с CSP, но не понимаю, почему это может быть проблемой. Что самое худшее, что может сделать CSP, заблокировать выполнение? Не то чтобы это собирались казнить с самого начала. А если не получится, есть и второе решение с атрибутом data-*. - person icktoofay; 23.08.2015
comment
Верно. Тестирование решения 1 работает нормально - кажется, что неисполняемые типы не считаются unsafe-inline - person mikemaccana; 23.08.2015
comment
Просто убедитесь, что данные в этих блоках json правильно экранированы! Вот хорошая запись в блоге об этой технике: mathiasbynens.be/notes/json-dom-csp - person oreoshake; 24.08.2015

В дополнение к отличному ответу @icktoofay, я хочу отметить, что некоторые библиотеки CSP, например Yahoo, Express CSP иметь useScriptNonce, который будет динамически генерировать одноразовые номера для scripts.

person mikemaccana    schedule 23.08.2015