2

在我的应用程序中,我有一些服务器变量:

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

这用于设置例如window.serverVars.countryCode由服务器使用 geoIP 确定的 countryCode。

现在在 CSP 中,这被认为unsafe-inline通常是不好的。那么最好的方法是什么:

  • 使用 nonce 很困难:nonce 每个请求都是唯一的,并且大多数 CSP 库(例如 Helmet)认为 CSP 策略是静态的
  • 使用哈希很困难: serverVars 的值对于每个请求都是唯一的,并且大多数 CSP 库(例如Helmet)认为 CSP 策略是静态的
  • unsafe-inlineforscript-src被认为是不安全的

使用 CSP 将动态服务器变量添加到客户端 JavaScript 的最佳方法是什么?

4

2 回答 2

4

我见过一些人使用scripts 和types 浏览器不会执行,然后从受信任的 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);
于 2015-08-23T16:30:32.757 回答
0

除了@icktoofay 的出色回答,我想指出一些CSP 库,例如Yahoo 的Express CSP有一个useScriptNonce可以动态生成nonce 的scripts.

于 2015-08-23T17:35:38.133 回答