谷歌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