【问题标题】:Content Security Policy jQuery Load PHP Echo Nonce内容安全策略 jQuery 加载 PHP Echo Nonce
【发布时间】:2018-10-28 20:57:19
【问题描述】:

在通过给它们一个随机数来删除所有不安全的内联脚本来强化我的 CSP 时,我在我网站的特定页面上遇到了问题。我编辑了所有内容,以便在小规模场景中更容易理解。

product.php 加载将显示产品的模板。

<div id="productDisplay"></div>
<script nonce="sampleCorrectNonce" type="text/javascript">
    product();
</script>

product.php?id=123 加载的是实际的产品数据,需要通过不同的场景来刷新新的信息。

if ($_GET['action'] === 'displayProduct') {
    echo '
    samleData
    <script nonce="sampleCorrectNonce" type="text/javascript">
        productReady();
        productOptions();
    </script>
    ';
}

在 product.php 上有一个初始的 javascript 代码,它会触发并将 product.php?id=123 按 ID 加载到 DIV 中。

product = function() {
    $("#productDisplay").load("//"+ document.domain + "/shop/product.php?action=displayProduct&id=123");
}

已创建随机数以允许内联脚本上的 CSP。尽管 nonce 完全匹配并且 在同一页面上内联显示,但它仍然会触发错误。

<html>
    <body>
        <div id="productTemplateStuffa"></div>
        <div id="productDisplay">
        samleData
        <script nonce="sampleCorrectNonce" type="text/javascript">
            productReady();
            productOptions();
        </script>
        </div>
        <div id="productTemplateStuffb"></div>
        <script nonce="sampleCorrectNonce" type="text/javascript">
           product();
        </script>
    </body>
</html>

出于某种原因,我无法弄清楚如何在保持 CSP 满意的同时将 jQuery 加载中的 PHP 回显内容包含到 DIV 中。

Firefox 的控制台错误:

内容安全政策:页面设置阻止加载 自己的资源(“script-src https://example.loc/ 'nonce-sampleCorrectNonce' 'unsafe-inline' 'unsafe-eval'”)。来源: 产品就绪(); ....

这基本上是标头发送的内容,我对其进行了编辑以使其简单并隐藏所有外部内容。

Content-Security-Policy: base-uri 'self';默认源“自我”; 连接源代码“自我”;字体源“自我”;形式动作“自我”; 框架祖先“无”; img-src“自我”数据:;媒体源“无”; 对象源“无”; script-src 'self' https://example.loc/ 'nonce-sampleCorrectNonce' 'unsafe-inline' 'unsafe-eval';样式-src 'self' '不安全的内联';升级不安全请求

删除它可以修复错误...

<script nonce="sampleCorrectNonce" type="text/javascript">
    productReady();
    productOptions();
</script>

这样做并不能修复错误...

<script nonce="sampleCorrectNonce" type="text/javascript">
</script>

这就是上面的 Chrome 和下面的 Firefox 显示内联脚本内容的方式。

<script nonce="" type="text/javascript" src="https://example.loc/theme/assets/global.jquery.min.js?v=1540058004"></script>

<script nonce="sampleCorrectNonce" type="text/javascript" src="//example.loc/theme/assets/global.jquery.min.js?v=1540058004"></script>

删除脚本标签内的所有内容,仍然会触发错误。好的,因为它触发了一个 GET 方法,所以它用一个新的随机数设置了新的标头。如果我在 GET 页面上没有脚本标签,那不会有问题。我有一个无法解决的问题,因为内容是动态的,哈希甚至不起作用。

在 GET 页面上执行此操作,允许标头匹配来自 GET 请求的随机数,但现在查看源显示不匹配的随机数,这是预期的。这意味着 CSP 仍将触发。

<script nonce="' . Headers::getInstance()->getScriptHash() . '" type="text/javascript">

对于这篇文章的篇幅,我深表歉意。我通过简单地重写代码解决了这个问题,因此 GET 请求上没有内联脚本。这就是你无论如何都应该做的事情,这可能也是他们设计 CSP 以这种方式工作的原因。

【问题讨论】:

  • 能否请您发布 chrome 控制台显示的有关 CSP 违规的完整错误消息。请您也发布您的完整 CSP 标头!
  • 加载 product.php 的 javascript 代码是否有可能具有来自另一个往返的随机数?在任何给定的客户端时刻,您是否检查了源中的所有 nonce 是否与标题中的 nonce 相同?
  • 起初,product.php?id=123 中的动态内容被赋予了第二个 nonce,我认为这是问题所在,所以我通过 product() javascript 函数传递了 nonce。在我这样做之后,在 Firefox 的 Inspector 中查看的随机数是匹配的。所以匹配的随机数不是问题。我将在上面的编辑中发布完整的 CSP。
  • 好的,现在一个问题的材料太多了,为什么你回答自己的问题,好像你知道答案一样?

标签: javascript php jquery echo content-security-policy


【解决方案1】:

如果所有呈现的标记都包含与您的 CSP 标头相同的随机数,它将起作用。因此,并非所有呈现的随机数都可能是您的标题的一部分。由于您在评论中提到您认为这不应该是问题所在,因此可以假设您的标记中仍然存在其他内联脚本。

Chrome 是这样说的:

请注意,如果源列表中存在散列值或 nonce 值,则忽略“unsafe-inline”。

Firefox 应该这样说:

内容安全策略:忽略 script-src 中的“'unsafe-inline'”:指定了 nonce-source 或 hash-source

由于您的源列表中显然有一个nonce-x,因此unsafe-inline 指令将被忽略。由于你仍然有那个指令,我只能假设你还有其他不使用 nonce 的内联脚本,这可能解释了你的错误。

【讨论】:

  • 恐怕不行。我删除了导致错误的“unsafe-inline”和“unsafe-eval”,但它什么也没改变。我花时间添加了一个本地证书,看看 Chrome 是怎么说的。在 Elements 选项卡中,它在脚本旁边显示“nonce”,但不显示 nonce,这对 Chrome 来说是否正常?为了进一步混淆问题,它说 Jquery 是罪魁祸首,我猜是因为它是页面上要加载的第一个脚本。我正在加载本地 jQuery。从 product.php?id=123 中删除 javascript 会使错误消失。
  • 是的,这在 Chrome 中是正常的,这就是为什么我说要查看源(上下文,显示源),然后显示随机数。我想您需要提供更多上下文、实际页面标记(或链接)和更完整的错误消息。
  • 好吧,Show Source 不会显示 jQuery 注入的内容,因为它是在页面加载后被插入到 DIV 中的。我知道我需要显示更多代码,我正在尝试弄清楚如何做到这一点,因为它的类和函数相当复杂。我会尽快更新主要问题...
猜你喜欢
  • 2020-07-21
  • 2021-08-03
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多