无法从其他服务器加载脚本 - 内容安全策略问题?

时间:2015-11-11 23:18:21

标签: javascript html dom bookmarklet

我一直在尝试将书签变成一个小型开发环境,我可以用它来测试一些javascript并轻松地发送命令并快速更新我服务器上的代码以查看结果。这已经使用了我在本网站和google中找到的方法的一半工作但是它似乎不能很好地工作,有时随机也无法工作。最终目标是有一个我可以从任何页面点击的书签,它加载我保存在我的服务器上的javascript文件。我创建了以下两个bookmarklet来尝试使其工作:

方法1失败:

javascript:
var s = document.createElement('script');
s.type='text/javascript';
document.body.appendChild(s);
s.src='//smewth.com/test.js';
void(0);

方法1在一行书签形式:javascript: var s = document.createElement('script'); s.type='text/javascript'; document.body.appendChild(s); s.src='//smewth.com/test.js'; void(0);

方法2失败:

javascript:(
 function(){
  var imported = document.createElement('script');
  imported.type='text/javascript';
  imported.src = 'https://smewth.com/test.js';
  document.head.appendChild(imported);
})();

方法2在一行书签形式:javascript:( function(){ var imported = document.createElement('script'); imported.type='text/javascript'; imported.src = 'https://smewth.com/test.js'; document.head.appendChild(imported); })();

我通过从(http://kickassapp.com/)分解kickass bookmarklet来获得方法1。我从他们的网站获得的实际工作在我的浏览器上没有问题。我甚至从他们用来加载我的URL的URL直接替换。我在这个网站上搜索时找到的第二种方法,这实际上工作了一段时间,并因某些未知原因(可能是不同的浏览器)停止工作。我尝试将这个脚本对象附加到每个脚本上的头部和主体上,但没有改善结果。

我为这篇文章创建了test.js脚本,它包含一个简单的警告框声明:

$$ [/]# cat test.js
alert("hi");
$$ [/]# 

注意:当我使用书签本身嵌入的代码执行此操作而不将其附加到头部/身体对象时,它可以正常工作,如下所示:

javascript:%20alert("hi");

我注意到,使用这两种方法,代码实际上都被注入到页面中,但是当我单击书签时,我没有看到代码被执行。有谁知道哪种方法是最好的或类似的东西,所以我可以通过我在远程服务器(可靠)更新的页面加载javascript?也许我需要将它附加到另一个对象上?

感谢您的帮助。

-Jeff

更新:我在此网站加载时显示此功能,但是当您在google.com这样的网站上时,它无法正常工作。不确定区别是什么或如何适应这一点,google.com也有头部和身体对象。我在某些网站上展示了这项工作,有些网站并没有。

1 个答案:

答案 0 :(得分:0)

我想出来了。发生了两件事,导致了这个问题的间歇性症状。第一个问题是托管代码的网站是在自签名证书上。我开始注意到只有在尝试从安全站点运行此问题时才会出现问题。然后在Chrome中我看到控制台中显示错误。如果Firefox在控制台上给我一个错误,或者因为这是问题的根源,这将是很好的。我要做的第二件事是在Firefox中禁用OCSP,因为我使用免费证书进行测试。

我还必须使用如上所述的方法1。由于某些原因,Firefox和Chrome都不喜欢匿名函数调用。从现在开始,我将引用Chrome来查找控制台中的错误,因为Firefox已经证明自己对此不太有用。