Chrome Extension:Content Security Policy (CSP) violation

解決在Chrome擴充套件中引入外部資源時碰到的Content Security Policy (CSP) violation。


同事在開發chrome擴充套件時,使用<script>標籤引入外部.js檔發生以下錯誤,造成無法對該資源發送請求:


要方便觀察到這個錯誤,可以在popup的頁面中寫以下方法,在<body>中建立一個引入外部.js的元素,然後綁在<button>上觸發


打開popup頁的chrome開發工具,切到Network標籤,然後按下button觸發function,會看到請求被瀏覽器擋住了


查詢之後認識了一個新名詞:Content Security Policy (CSP)。

CSP是W3C制定的一個Web標準,主要是透過限制網頁對外部檔案的存取,防止跨域腳本攻擊(Cross-Site Script,XSS)。

Chrome規定擴充套件的開發必須定義CSP規則,在manifest.json的content_security_policy中做設定。

上述資源被擋住的原因是,原先manifest.json的content_security_policy設定中,只允許self和unsafe-eval。

self表示允許同網域的資源,

unsafe-eval表示允許執行程式碼字串的函式 (ps.關於eval可參考MDN文件)。

因此只要將外部網站設定在可存取的規則內,就能在擴充套件中使用<script>標籤引入外部.js資源


另外如果不介意程式大小的話,其實把資源下載下來放在專案內一起打包給擴充套件,就可以不用特別針對CSP做設定。


關於CSP的更多資訊以及使用方式,可參考MDN文件:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy

https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP