2014-02-14 30 views
4

我有一個將Javascript注入頁面的書籤,並打開了一個帶有我創建的HTML頁面的iframe,該頁面允許用戶直接從我的小書籤訂閱頁面。如何檢查網站是否允許我使用我的書籤注入Javascript?

問題是,某些域(Twitter和Facebook是兩個)不允許我注入Javascript,所以我不得不彈出一個窗口。

的Javascript控制檯在Facebook上時:

拒絕,因爲它違反了以下內容安全策略指令加載腳本腳本名:「腳本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:// .ak amaihd.net http:// .akamaihd.net * .atlassolutions.com「。

現在在我的小書籤中我只是檢查URL是否與這些域匹配,然後嘗試注入JS,如果是,則彈出一個新窗口。出於顯而易見的原因,這不是一個好的做法。

什麼是檢查Javascript函數是否被允許在當前頁面上運行的好方法,如果不是,則打開一個新窗口?

+0

讓它使用AJAX調用回家。 –

+0

你是什麼意思「不允許我注入JavaScript」?他們如何禁止它? – Pointy

+0

拒絕加載腳本* script *,因爲它違反了以下內容安全策略指令:「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「。 – tommybond

回答

4

無法完全確定地知道外部腳本加載失敗。即使沒有安全策略,由於其他問題,外部腳本也可能無法加載。唯一可以做的事情就是設置一個超時時間,如果腳本在超時過期之前還沒有完成某些操作,則假定它未能加載。

編輯:我站在下面的肖恩糾正。他的建議也適用於Windows和Chrome瀏覽器。解決的辦法是這樣的:

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

有關如何檢查頁頭返回內容安全策略,這將阻止你的外部腳本的具體問題,我所知道的唯一的解決辦法是檢查HTTP報頭使用AJAX。

以下是一些示例代碼。我已經在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(); 
+0

+1 - 非常好的解決方案。對於替代,'script.addEventListener('錯誤,回調,錯誤)'工作(在大多數情況下)? –

+1

爲了記錄,我嘗試了'(函數(d,c,b,l,s){c = c [b](d),b = d.body; s = c('script'); s.src ='http://google.com/not/js.js'; s [l]('load',console.log.bind(console,'load'),false); s [l]('error' ,console.log.bind(console,'error'),false); b.appendChild(s);})(document,document.createElement,'bind','addEventListener');'並且出現加載錯誤(Opera 19,在Github上測試過)。 –

+0

不錯。由於某種原因,我在腦海中相信這不可能跨域。但似乎沒問題。很高興知道它。 –

0

Bookmarklet應該被允許運行任何安全策略。如果沒有,這是一個瀏覽器錯誤 - 至少如果我正確理解這一點。但小書籤可能被禁止做某些事情。如果你使用try-catch,你可以找出是否允許一個動作。

相關問題