内容安全策略:初始加载后允许文件?

时间:2018-01-14 03:46:08

标签: content-security-policy

理论上,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>

  • 我不保证上面的示例代码能够以任何身份运行,并且认识到上述代码段远非最佳实践。
  • 上述代码的目的仅仅是提供一个示例,说明CSP如何在动态环境中无法提供所需结果,以解决问题:

除了预加载所有脚本(这可能对速度,维护,带宽有害,以及 - 对于那些关心SEO的人)之外,是否有100%有效的解决方法而不降低CSP的有用性质?< / p>

0 个答案:

没有答案