使用SRI保護你的網(wǎng)站免受第三方CDN惡意攻擊

出于速度和降低服務(wù)器負載考慮艺配,有時候我們會選擇使用 CDN 加載第三方靜態(tài)資源。對于一些熱門的第三方庫惋砂,在用戶打開你的網(wǎng)頁之前就很有可能在瀏覽別的網(wǎng)站時被瀏覽器緩存下來妒挎,這樣就可以極大的提升網(wǎng)頁加載速度。

然而使用 CDN 也提高了網(wǎng)站的安全風(fēng)險:第三方靜態(tài)資源放在第三方服務(wù)器上西饵,CDN 的擁有者有沒有可能偷偷的篡改這些文件酝掩,加入惡意代碼呢?或者 CDN 服務(wù)器遭受了黑客攻擊眷柔,整個文件被替換掉期虾。雖然可能性不高原朝,但不是零。JavaScript 對于當(dāng)前瀏覽器頁面有完全控制權(quán)镶苞,他們不僅僅能獲取到頁面上的任何內(nèi)容喳坠,還能抓取用戶輸入的一些諸如密碼之類的機密信息,還能獲取到保存到 Cookie 中的登錄票據(jù)等等內(nèi)容茂蚓,這就是所謂的 XSS 攻擊壕鹉。

我們需要一種機制確保從 CDN 下載的文件未被惡意篡改。某些下載網(wǎng)站就提供下載文件的 MD5 或 SHA1 碼用于檢查所下載文件的完整性聋涨,網(wǎng)頁中有沒有類似的機制呢晾浴?

什么是 SRI

子資源完整性?Subresource Integrity?簡稱 SRI 是一種安全機制,它用于讓瀏覽器檢查所下載的來自第三方的資源(例如 CDN)未被惡意篡改牍白。它使用哈希值檢查確保第三方資源的完整性脊凰。只要開發(fā)者提供了被需下載資源的哈希值,瀏覽器就可以檢查實際下載的文件是否與預(yù)期的哈希值匹配茂腥。

使用 SRI

只需給?script?或?style?標簽添加?integrity?屬性即可狸涌。例如:


給?script標簽添加?integrity?屬性


給style標簽添加?integrity?屬性

integrity?屬性值以?shaXXX-?開頭,表示后面的哈希值使用的哈希算法最岗,目前只允許?sha256、sha384?或?sha512?這三種哈希算法仑性,以?sha384?比較多見。后面跟對應(yīng)的哈希值即可歼捐。

值得注意的是晨汹,因為啟用?SRI?需要獲取所下載文件的內(nèi)容進行計算,所以需要 CDN 服務(wù)器啟用跨域資源訪問(CORS)支持剥扣,即返回?Access-Control-Allow-Origin: *?頭铝穷。客戶端需要使用跨域的形式加載指定文件曙聂,即添加?crossorigin="anonymous"?屬性。就我所知断国,目前國內(nèi)相對常用的免費 CDN?bootcdn?已經(jīng)支持 CORS,百度靜態(tài) CDN 還不支持霞捡。

瀏覽器如何處理 SRI

當(dāng)瀏覽器遇到一個帶有?integrity?的?script?或?style?標簽碧信,在執(zhí)行其中的 JS 腳本或應(yīng)用其中的 CSS 樣式之前输涕,瀏覽器會首先計算所下載文件的內(nèi)容的哈希值是否與?integrity?屬性給定的值相同慨畸。

如果計算結(jié)果與給定值不匹配寸士,瀏覽器會拒絕執(zhí)行腳本內(nèi)容,并報出一個網(wǎng)絡(luò)錯誤乃正,類似如下結(jié)果:

Failed to find a valid digest?in?the?'integrity'?attribute?for?resource?'https://cdnjs.cloudflare.com/ajax/libs/normalize/6.0.0/normalize.min.css'?with computed SHA-256?integrity?'VbcxqgMGQYm3q8qZMd63uETHXXZkqs7ME1bEvAY1xK8='. The resource has been blocked.

如何計算哈希值

這是 SRI 標準文檔提供的例子

$ echo -n?"alert('Hello, world.');"?|?openssl?dgst -sha384 -binary |?openssl?base64 -A

使用了?OpenSSL?這個 *nix 中通常都包含的工具計算哈希值瓮具。其中?alert('Hello, world.');?是文件內(nèi)容凡人,你也可以用?cat Filename.js?直接讀取某個文件。

輸出?H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO传睹,在此基礎(chǔ)上添加前綴?sha384-?就可以了欧啤。

網(wǎng)上也有現(xiàn)成的 SRI 哈希值生成器启上,方便好用:https://srihash.org/

CSP 與 SRI

你可以使用?內(nèi)容安全政策?(CSP)強制要求當(dāng)前頁面所有腳本加載標簽啟用 SRI。例如

Content-Security-Policy:?require-sri-for?script;

強制要求所有?script?標簽啟用 SRI倒慧,瀏覽器會拒絕加載未啟用 SRI 的 script 標簽迫靖。

對應(yīng)的還有 CSS 版本:

Content-Security-Policy:?require-sri-for?style;

你也可以同時啟用兩者。

錯誤恢復(fù)

使用 CDN 時別忘了當(dāng)嘗試從 CDN 加載文件失敗后加載本地版本:


當(dāng)嘗試從 CDN 加載文件失敗后加載本地版本

原鏈接:https://segmentfault.com/a/1190000011337230

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盹牧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌口柳,老刑警劉巖跃闹,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件望艺,死亡現(xiàn)場離奇詭異肌访,居然都是意外死亡,警方通過查閱死者的電腦和手機惩激,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門风钻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轨帜,“玉大人,你說我怎么就攤上這事哮兰『戎停” “怎么了膏秫?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吹榴。 經(jīng)常有香客問我滚婉,道長,這世上最難降的妖魔是什么远剩? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任瓜晤,我火速辦了婚禮腹纳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘志群。我一直安慰自己蛔钙,他們只是感情好吁脱,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布兼贡。 她就那樣靜靜地躺著娃胆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凿蒜。 梳的紋絲不亂的頭發(fā)上胁黑,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音漂洋,去河邊找鬼。 笑死演训,一個胖子當(dāng)著我的面吹牛贝咙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颈畸,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼眯娱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了徙缴?” 一聲冷哼從身側(cè)響起于样,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤穿剖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秀又,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡吐辙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年昏苏,在試婚紗的時候發(fā)現(xiàn)自己被綠了贤惯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡救巷,死狀恐怖浦译,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情精盅,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布妻枕,位于F島的核電站粘驰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏愕掏。R本人自食惡果不足惜顶伞,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滑潘。 院中可真熱鬧语卤,春花似錦蓖租、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睬关,卻和暖如春毡证,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丐箩。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屎勘,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓丑慎,卻偏偏與公主長得像瓤摧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子照弥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容