谷歌發佈實驗性可信類型API,用於解決跨站點腳本漏洞

谷歌Chrome團隊發佈了實驗性可信類API,用以解決DOM跨站點腳本(Cross-Site Scripting,簡稱XSS)安全漏洞。谷歌的漏洞賞金計劃報告說DOM XSS是最常見的XSS安全變種。

谷歌軟件安全工程師Krzysztof Kotowicz解釋了開發人員在XSS方面所面臨的挑戰:

實踐證明,維護無XSS的應用程序仍然是個嚴峻的挑戰,尤其是當應用程序很複雜時。儘管防止服務器端XSS的解決方法已經是衆所周知的,但基於DOM的跨站點腳本(DOM XSS)問題卻日益嚴峻。

挑戰在於,引入XSS十分容易,但難以檢測到。

可信類型可以從根源上解決這些XSS問題,有助於消除DOM XSS漏洞。

可信類型允許開發人員鎖定危險的注入池,在默認情況下它們是安全的,而且不能用字符串進行調用。可以通過內容安全策略(Content Security Policy,簡稱CSP)HTTP響應標頭Content-Security-Policy: trusted-types *來設置可信類型。

這樣就避免了XSS的常見來源,例如這個來自谷歌的示例:

const templateId = location.hash.match(/tplid=([^;&]*)/)[1];
// typeof templateId == "string"
document.head.innerHTML += templateId // Throws a TypeError.

可信類型引入了一個新的全局變量,所以我們可以直接使用這個變量,而不是通過策略來設置:

const templatePolicy = TrustedTypes.createPolicy('template', {
  createHTML: (templateId) => {
    const tpl = templateId;
    if (/^[0-9a-z-]$/.test(tpl)) {
      return `<link rel="stylesheet" href="./templates/${tpl}/style.css">`;
    }
    throw new TypeError();
  }
});

const html = templatePolicy.createHTML(location.hash.match(/tplid=([^;&]*)/)[1]);
// html instanceof TrustedHTML
document.head.innerHTML += html;

模板策略在創建HTML之前會驗證傳給它的模板ID參數。該策略對象將用戶定義的createHTML函數封裝在可信類型對象中 。除了驗證templateId對修復XSS有效外,現在可能引入DOM XSS漏洞的代碼只有策略代碼,從而減少審查代碼庫中與檢測DOM XSS安全問題有關的區域。

目前,可信類型包括HTML、URL、ScriptURL和Script。可信類型的CSP可能被限制於一個或所有可信類型策略。

開發人員可以在實時網站或Web應用程序中嘗試可信類型,方法有:註冊Trusted Types Origin Trial 、通過命令行
chrome --enable-blink-features=TrustedDOMTypes在本地安裝的Chrome中啓用該功能、在Chrome中打開
chrome://flags/#enable-experimental-web-platform-features。

現在還有可信類型polyfill,用於在其他瀏覽器中嘗試該功能。polyfill有兩種變體,其中一種只支持API,包含可信類型的代碼庫仍然可以在老版本的瀏覽器中運行;另一種支持基於文檔中的CSP策略在DOM中強制執行類型。這裏有一個使用可信類polyfill的示例。

問題和反饋可以報告給WICG可信類GitHub項目,或者在可信類谷歌小組中討論。歡迎開發者通過WICG貢獻指南對可信類型規範做出貢獻。

查看英文原文:Experimental Trusted Types API to Combat Cross-Site Scripting Vulnerabilities

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章