content-security-policy - 如何使用 CSP 在 JS 中包含服务器变量?

标签 content-security-policy helmet.js

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

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

这用于将 window.serverVars.countryCode 设置为由服务器使用 geoIP 确定的国家/地区代码。

现在在 CSP 中,这被认为是不安全内联,这通常是不好的。那么最好的方法是什么:

  • 使用随机数很困难:每个请求的随机数都是唯一的,并且大多数 CSP 库(例如 Helmet)认为 CSP 策略是静态的
  • 使用哈希很困难:每个请求的 serverVars 值都是唯一的,并且大多数 CSP 库(例如 Helmet )将 CSP 策略视为静态
  • script-srcunsafe-inline 被认为是不安全的

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

最佳答案

我见过一些人使用浏览器不会执行的带有 typescript,然后从受信任的 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);

关于content-security-policy - 如何使用 CSP 在 JS 中包含服务器变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32168851/

相关文章:

javascript - 是否有可能通过 Javascript 捕获 CSP 错误

Firefox OS 模拟器中的 JavaScript 问题(CSP 警告)

content-security-policy - 为什么 'data:' 会成为 CSP 的 script-src?

node.js - Helm CSP 无法正常工作?

express - DNS 预取如何危害安全/隐私?

google-chrome-app - Chrome 打包应用程序中的 Mathjax

google-chrome - 拒绝框架“https ://www. youtube.com/embed/xxxxx,因为它违反了内容安全策略指令”

typescript - 使用 TypeScript 表达 CSP Nonce

express - Helmet 和 contentSecurityPolicy 并使用 nonce 并添加它但仍然出错