javascript網頁 - javascript語法




如何確保通過CDN傳遞的JavaScript文件沒有被更改? (4)

我正在研究將一些JavaScript文件託管在CDN上的情況。 我想要某種機制,以便在用戶端下載這些文件時,可以確保文件沒有被篡改,並且確實來自指定的CDN。

我了解如果使用SSL,該任務非常容易,但是,我仍然要確保即使在沒有SSL的HTTP上也可以提供正確的文件。

就我所能搜索到的而言,目前尚無跨平台支持的機制,例如JavaScript文件的數字簽名。 也許不需要?

瀏覽器是否內置了某些方法來驗證JavaScript文件的作者? 我能以安全的方式執行此操作嗎?


如果您的對手模型允許攻擊者修改從CDN傳遞來的JavaScript文件,則您的對手模型允許攻擊者修改傳遞來的參考源以消除任何驗證嘗試,從而將源地址更改為CDN和/或完全刪除對JavaScript的引用。

而且,不要讓蠕蟲打開您的應用程序如何通過HTTP請求(或任何其他沒有經過驗證的信任鏈的機制)確定用戶的解析器是否正確解析為CDN的蠕蟲。

/ etc / hosts中:

#  ...
1.2.3.4    vile-pirates.org    trustworthy.cdn
#  ...

實際上, 目前正在 Subresource Integrity 的名稱 起草 這樣的功能。 查看 <script> 標記的 integrity 屬性。 儘管尚未全面採用 ,但僅能滿足此目的。

integrity

包含內聯元數據,用戶代理可使用這些內聯元數據來驗證獲取的資源是否已交付而沒有意外的操作。 請參閱子資源完整性。

Source

子資源完整性(SRI)是一項安全功能,使瀏覽器可以驗證是否已交付獲取的文件(例如,從CDN獲取的文件)而沒有意外的操作。 通過允許您提供讀取的文件必須匹配的加密散列來工作。

Source

例:

<script src="https://example.com/example-framework.js"
    integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
    crossorigin="anonymous"></script>

但是請注意,如果通過純HTTP傳輸資源,這 將無法保護您免受 中間人攻擊 。 在這種情況下,攻擊者可以欺騙哈希碼,從而使針對操縱腳本文件的防禦變得毫無用處。

因此,除了上述安全措施外,還應始終使用安全HTTPS連接而不是純HTTP。


關於這種簽名可以做什麼和不能做什麼有一個重要的觀點。 它 可以 保護用戶免受有人修改您的代碼的假想攻擊。 它 不能 確保您的站點您的代碼是正在執行的代碼。 換句話說,您仍然不信任來自客戶端的任何內容。


免責聲明:與往常一樣,您僅應在使用https時將這些機制視為有用,因為可以通過MitM和http輕鬆禁用它們。

除了上述答案中的機制之外,您還可以在父頁面上使用 內容安全策略 http響應標頭。

http://www.html5rocks.com/en/tutorials/security/content-security-policy/

內容安全政策:script-src'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng ='

這裡有幾件事要注意。 sha *-前綴指定用於生成哈希的算法。 在上面的示例中,使用了sha256-。 CSP還支持sha384-和sha512-。 生成哈希時,請勿包含標籤。 大寫和空格也很重要,包括前導或尾隨空格。

使用Chrome 40或更高版本,您可以打開DevTools,然後重新加載頁面。 對於每個內聯腳本,“控制台”選項卡將包含帶有正確的sha256哈希值的錯誤消息。

這種機制已經存在了很長一段時間,因此瀏覽器支持可能還不錯,只需確保檢查一下即可。

此外,如果要確保不兼容的較舊版本的瀏覽器不是不安全的,則可以在策略不允許的頁面頂部添加同步重定向腳本。





code-signing