在遵守内容安全策略的同时,如何从PHP脚本设置JavaScript变量

在遵守内容安全策略的同时,如何从PHP脚本设置JavaScript变量,javascript,php,content-security-policy,Javascript,Php,Content Security Policy,我们正在重新设计一些应用程序,其中一个要求是能够遵守不允许内联脚本的内容安全策略 一般来说,大多数事件处理程序和逻辑块都已经存在于外部文件中,移动剩余的散乱程序不是问题,以下情况除外 我们有存储在SQL数据库中的设置,我们必须使其中一些值可用于呈现HTML页面的.js文件 通常我会这样做: <script> var ns.i = '<?= $i;?>', ns.j = '<?= $j;?>'; </script> 变量ns.i=“”,

我们正在重新设计一些应用程序,其中一个要求是能够遵守不允许内联脚本的内容安全策略

一般来说,大多数事件处理程序和逻辑块都已经存在于外部文件中,移动剩余的散乱程序不是问题,以下情况除外

我们有存储在SQL数据库中的设置,我们必须使其中一些值可用于呈现HTML页面的.js文件

通常我会这样做:

<script>
var ns.i = '<?= $i;?>',
    ns.j = '<?= $j;?>';
</script> 

变量ns.i=“”,
ns.j='';
在我看来,我有这些潜在的选择:

  • 将所需值放入关联数组中,对其进行json_编码,并将其放入隐藏的表单字段中。这对我来说就像是一个黑客,但从我的角度来看也是最简单的
  • 创建一个div标记并将所有值放入HTML5数据属性中
  • 创建表单并将值放入隐藏的表单字段中
  • 生成nonce并在脚本标记上设置nonce属性,并设置CSP头nonce
  • 到目前为止,我无法找到这类事情的建议或记录在案的最佳实践


    重构这段代码需要做大量的工作,我希望尽我最大的努力确保我们目前正在以尽可能最好的方式进行重构。

    我个人喜欢您列出的选项中最好的选项2。另一个选项是设置一个单独的端点来返回JSON负载,并让javascript通过XHR/AJAX request.Ah访问它。因此,设置一个页面来返回这些值,然后使用类似$.get()的内容来获取数据。这可能对其他事情也有用。我会调查的。