HTML5 crossorigin 屬性是什麼

常在開發時看到 CDN 的網址中,使用上 crossorigin="anonymous" 屬性,例如:

MDN – CORS settings attributes 文件中說明如下:

在 HTML5 中,一些 HTML 元素提供了對 CORS 的支持, 例如 <audio><img><link><script><video> 均有一個跨域屬性 (crossOrigin property),它允許你配置元素獲取數據的 CORS 請求。

默認情況下(即未指定 crossOrigin 屬性時),CORS 根本不會使用。在非同源情況下,設置 “anonymous” 關鍵字將不會通過 cookies,客戶端 SSL 證書或 HTTP 認證交換用戶憑據。


canvas 跨域將圖片載入使用

由 JS 產生的圖片實體,指定 canvas 動元素繪製圖片正常呈現

由圖片指定 src 路徑時載下檔案進快取,在 Image 的屬性中本身就有 crossOrigin 預設為 null
canvas 大小由載下的圖片檔取得高寬值後,指給 myCanvasEL 動原素,圖片由載下到進 canvas 繪製時這個過程是沒問題的。

外部圖片要處理成 base64 格式,前提要先 access-control-allow-origin: *

.toDataURL() 為 canvas 轉出畫布為一張 base64 格式的圖片,在轉換時除了圖片的標籤屬性要為 .crossOrigin = 'anonymous'; 或是空字串,讓 JS 在取圖片元素了解,這是張跨域而可不用屬名,執行時才可順利處理,但在這之前需特別注意伺服器端對於資源有設定為 access-control-allow-origin: * (跨來源資源共用)。

圖片來源:開源 pexels

改以 Google 的 logo 為例,伺服器對於圖傳送設定上本身就沒有 access-control-allow-origin: * (跨來源資源共用),也因此會產生非同源的錯誤提示。

img.crossOrigin 預設 null,若使用 canvas 操作轉換圖片,就會產生 The operation is insecure. 錯誤提示

現代的瀏覽器會預設規定 canvas 只能按照 tainted 方式讀取非同域名下的圖片資源。

taint 中文為 污染意指上色、貼膜的意思,比如給汽車車窗貼膜。可理解成瀏覽器以貼膜方式,應該是指只能將圖片貼在 canvas 上,但不能將圖片作為數據讀出來,從而防止某些隱私信息隨著圖片傳到別的地方。

此時的 canvas 畫版中,已將圖片指於畫版繪製出畫面,在透過 .getImageData() & .toDataURL() 相關圖片操作方法轉出圖片,此時就會出現錯誤提示 The operation is insecure.,這主要將所繪製的畫面,限定於不能以數據的方式直接讀出。

指定來原圖片屬性 crossOrigin = ‘anonymous’,修正 canvas 無法跨域轉出圖片的安全性錯誤提示

當使用到 canvas 的相關圖片操作方法 .getImageData() & .toDataURL()
img crossOrigin 屬性為 null 時就會出現錯誤提示 The operation is insecure.
需在 .onload 產生圖片實體前,先指定圖片屬性 img.crossOrigin = 'anonymous’ 就不會在出現錯誤中斷的提示。

HTML5 靜態元素 img 取 CROS 資源,使用 crossorigin=’anonymous’,將 canvas 轉出成 base64 格式圖片

上面的功能以 HTML5 靜態元素方式載入圖片 <img> 元素中,使用 crossorigin='anonymous' 屬性,當然如果在透過遠端取得的來源圖片,要由 canvas 用轉出圖片的方法,沒有 crossorigin='anonymous' 屬性 是會回應 The operation is insecure.,中斷於 canvas 繪製出圖片於元素上,沒能將所繪製的部份轉出成 base64 的圖片格式。


參考資料

HTML5 script 標簽裡的 crossorigin 屬性到底有什麼用?
HTML5 img 與 link 標簽裡的 crossorigin 屬性到底有什麼用
解決canvas圖片getImageData,toDataURL跨域問題