2

我試圖創建一個與github交互的擴展。 我需要在我的代碼中使用「eval」,但我仍然被頁面CSP阻塞。 這是我的代碼的簡化版本:「eval」被CSP在page-mod的內容中使用屏蔽

const pageMod = require("sdk/page-mod").PageMod; 

var contentScript = 'try {eval("console.log(\'hello from eval\')");} catch (e) {console.log("page mode " + e.message);}'; 

pageMod({ 
    include: "*", 
    contentScript: contentScript , 
    contentScriptWhen: "start" 
}); 

有人可以幫我解決這個問題?

+0

當我打開google.ca時,您的代碼適用於我。你究竟得到什麼錯誤? – canuckistani

+0

我得到的消息是「頁面模式調用eval()被CSP阻止」。去google.com也適用於我的問題出現時,我去https://github.com/ – erez

回答

1

這是因爲內容安全策略:https://developer.mozilla.org/en-US/docs/Security/CSP/CSP_policy_directives

通常的99%的時間中,eval使用可以用別的東西代替。如果你給出了上下文(爲什麼你需要評估),我們可以嘗試提出一個替代方案。 這是簡單的方法。

困難的方法是攔截來自github的迴應,使用the observer notification "http-on-examine-response"刪除該標頭,這裏有一個full example,但您可能有一個簡化版本。

就個人而言,我會盡量避免使用eval,它通常更容易。

+0

感謝您的答案。雖然我同意使用eval通常被認爲是「邪惡的」,但是使用我的附加設計,我不得不使用它。 我看了一下PageMode模塊的SDK實現,並且據我所見,它使用Components.utils.Sandbox和Components.utils.evalInSandbox使用 在頁面上運行contentScript。 如果代碼是「沙盒」形式的頁面,那麼我認爲沒有理由被頁面的CSP阻止。在Chrome瀏覽器(也從頁面「沙箱」內容腳本),我使用eval沒有問題。請你能解釋爲什麼「沙箱」代碼會受到影響嗎? – erez

+0

關於谷歌瀏覽器,我不知道是否以及如何實現CSP,所以我無法回答。關於Firefox上的附加組件,答案很簡單:內容腳本的執行權限與主機頁面相同,低於在瀏覽器環境中運行的附加代碼(chrome,因此與系統校長)。我並不是說'eval'被認爲是「邪惡的」,我只是說你可能會得到相同的結果,做更好的或者不同的事情。但是,如果不知道你想達到什麼目標,除了我給的那個,我們不能向你建議任何好的選擇。 – ZER0