【发布时间】: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