如何检查网站是否允许我用我的书签注入Javascript?

时间:2014-02-14 19:37:05

标签: javascript jquery code-injection bookmarklet

我有一个书签,它将Javascript注入页面并打开一个iframe,其中包含我创建的HTML页面,允许用户直接从我的书签中订阅页面。

问题是,某些域名(Twitter和Facebook是两个)不允许我注入Javascript,所以我必须弹出一个窗口。

Facebook上的Javascript控制台:

  

拒绝加载脚本脚本名称,因为它违反了以下内容安全策略指令:“script-src https:// .facebook.com http:// .facebook.com https:// .fbcdn.net http:// .fbcdn.net * .facebook.net * .google-analytics.com * .virtualearth.net .google。 com 127.0.0.1: * .spotilocal.com:* chrome-extension:// lifbcibllhkdhoafpjfnlhfpfgnpldfl'unsafe-inline''unsafe-eval'https:// .akamaihd.net http:// .akamaihd.net * .atlassolutions.com“。

现在在我的bookmarklet中我只是在尝试注入JS之前检查URL是否与这些域匹配,如果是,我会弹出一个新窗口。出于显而易见的原因,这不是一个好习惯。

检查是否允许在当前页面上运行Javascript函数的好方法是什么,如果没有,打开一个新窗口?

2 个答案:

答案 0 :(得分:4)

没有办法绝对肯定地知道外部脚本无法加载。即使没有安全策略,由于其他问题,外部脚本也可能无法加载。唯一的你可以真正做的一件事就是设置超时,如果脚本在超时到期之前没有完成某些操作,则认为它无法加载。

编辑:我的观点由肖恩在下面纠正。他的建议也适用于Windows上的Chrome和Firefox。解决方案是这样的:

newScript.addEventListener('error', function(){ console.log('script failed to load') });

关于如何检查页眉是否返回阻止外部脚本的内容安全策略的具体问题,我所知道的唯一解决方案是使用AJAX检查HTTP头。

以下是一些示例代码。我在Facebook上测试了这个。

req = new XMLHttpRequest;
req.onreadystatechange = function(){if (req.readyState==4) console.log(req.getResponseHeader('content-security-policy'))};
req.open("HEAD", document.location.href);
req.send();

答案 1 :(得分:0)

应该允许Bookmarklets运行任何安全策略。如果没有,这是一个浏览器错误 - 至少如果我理解正确的话。但是小书签可能被禁止做某些事情。如果您使用try-catch,您可以查看是否允许某个操作。