理论上,Content-Security-Policy标头非常棒。在实践中,我遇到了一个问题。如果页面加载CSP,稍后您(例如,动态加载登录页面),则必须已包含该页面的JS文件。因为即使登录页面使用的绝对URL与索引页面所在的域匹配(并且在CSP中为script-src设置),也会阻止它加载。
当我使用一个随机数来试图绕过这个时,出现了同样的问题,但这是间歇性的。有时它会让相同的nonce javascript文件加载,有时它不会。
如果不清楚,动态加载的脚本会触发CSP关于"不安全内联脚本的想法。"
使用强大的CSP加载动态JS / CSS文件是否有100%有效的方法?
自由格式代码示例:
的index.php:
<?php Header("Content-Security-Policy: default-src 'none'; script-src 'self' https://example.com"); ?>
<script src="triggerLogin.js"></script>
<a href="login.php" class="loginLink">Login</a>
<div class="futureLoginPage"></div>
triggerLogin.js :( CSP允许)
$('.loginLink').on('click', function(event)
{
$('.futureLoginPage').load('/login.php');
event.stopPropagation();
event.preventDefault();
return false;
});
的login.php:
<script src="https://example.com/loginFormVerify.js" type="text/javascript"></script>
<input type="text" class="user" placeholder="Username" />
<input type="text" class="pass" placeholder="Password" />
<input type="button" class="send" value="Send" />
<div class="authStatus"></div>
loginFormVerify.js :( CSP Forbids)
$('.send').on('click', function()
{
post("/verification.php", { user: $('.user').val(), pass: $('.pass').val() }, function(data)
{
$('.authStatus').html(data);
});
});
如果我在帖子中使用https://example.com/并不重要&#39;函数,因为CSP甚至不加载loginFormVerify.js文件,更不用说检查它的内容。
相反,如果我从JS脚本源中删除https://example.com/,让它解析为自己对域的理解并不重要。它仍然失败。
如果我添加type =&#34; text / javascript&#34;这并不重要。或者输入=&#34; application / javascript&#34;一个或两个标签。如上所述,nonce只是间歇性地帮助从服务器发送的动态加载的JS文件。
虽然我们正在努力,但如果我拥有&#39; &#39;围绕标题中的域名。
另外,我可以删除&lt; / script&gt;标签并使用以下完全相同的结果:
<script src="..." />
我在Safari,Chrome和Firefox上尝试了上述连接方式,结果相同。移动版上的Safari和Chrome也是如此。
我知道一个解决方法是将所有JS功能压缩到index.php级别的单个文件中,但我很好奇是否有办法以其他方式处理这个问题。 / p>
除了预加载所有脚本(这可能对速度,维护,带宽有害,以及 - 对于那些关心SEO的人)之外,是否有100%有效的解决方法而不降低CSP的有用性质?< / p>