如何使用 CSP 在 JS 中包含服务器变量?
How can I include server variables in JS with CSP?
在我的应用程序中,我有一些服务器变量:
{{# serverVars }}
<script>
window.serverVars = {{{ . }}};
</script>
{{/ serverVars }}
这用于设置,例如,window.serverVars.countryCode
由服务器使用 geoIP 确定的国家/地区代码。
现在在 CSP 中,这被认为是 unsafe-inline
,这通常是不好的。那么最好的方法是什么:
- 使用 nonce 很困难:每个请求的 nonce 都是唯一的,并且大多数 CSP 库(例如 Helmet)认为 CSP 策略是静态的
- 使用散列很困难:serverVars 的值对于每个请求都是唯一的,并且大多数 CSP 库(例如,Helmet)认为 CSP 策略是静态的
unsafe-inline
对于 script-src
被认为是不安全的
使用 CSP 将动态服务器变量添加到客户端 JavaScript 的最佳方法是什么?
我看到有些人使用浏览器不会执行的 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="{"environment": "production", ...}">
...
然后再次在您的 JavaScript 中获取它:
var config = JSON.parse(document.documentElement.dataset.config);
除了@icktoofay 的出色回答之外,我想指出一些 CSP 库,例如 Yahoo 的 Express CSP 有一个 useScriptNonce
可以为 scripts
动态生成随机数。
在我的应用程序中,我有一些服务器变量:
{{# serverVars }}
<script>
window.serverVars = {{{ . }}};
</script>
{{/ serverVars }}
这用于设置,例如,window.serverVars.countryCode
由服务器使用 geoIP 确定的国家/地区代码。
现在在 CSP 中,这被认为是 unsafe-inline
,这通常是不好的。那么最好的方法是什么:
- 使用 nonce 很困难:每个请求的 nonce 都是唯一的,并且大多数 CSP 库(例如 Helmet)认为 CSP 策略是静态的
- 使用散列很困难:serverVars 的值对于每个请求都是唯一的,并且大多数 CSP 库(例如,Helmet)认为 CSP 策略是静态的
unsafe-inline
对于script-src
被认为是不安全的
使用 CSP 将动态服务器变量添加到客户端 JavaScript 的最佳方法是什么?
我看到有些人使用浏览器不会执行的 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="{"environment": "production", ...}">
...
然后再次在您的 JavaScript 中获取它:
var config = JSON.parse(document.documentElement.dataset.config);
除了@icktoofay 的出色回答之外,我想指出一些 CSP 库,例如 Yahoo 的 Express CSP 有一个 useScriptNonce
可以为 scripts
动态生成随机数。