谷歌发布实验性可信类型API,用于解决跨站点脚本漏洞

2019 年 3 月 23 日

谷歌发布实验性可信类型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

2019 年 3 月 23 日 08:00 3388
用户头像

发布了 199 篇内容, 共 63.6 次阅读, 收获喜欢 268 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营 -week09 学习总结

GunShotPanda

当百度遇上新基建:开放是基本原则 做智能时代的赋能者

百度大脑

人工智能 百度 AI 新基建 百度大脑

Week 09 学习总结

Jeremy

换一种方式构建镜像

北漂码农有话说

「查缺补漏」巩固你的Redis知识体系

Kerwin

Java redis

充分释放数据价值:安全、可信6到飞起

华为云开发者社区

区块链 数据共享 华为云 可信安全计算 数据价值

Week09作业

熊威

百度大脑人脸离线识别SDK升级盘点,Linux ARM版本上线

百度大脑

人工智能 人脸识别 百度大脑 sdk

Week 09 命题作业

Jeremy

架构师训练营第九周

WW

NIO的组成有哪些——奈学

古月木易

nio

打造高转化率网站不得不遵循的3条规范

姜奋斗

网站架构 网站 网站搭建 高转化率 转化

日入斗金,稳赚不赔?小心泛滥网络的兼职刷单让你钱尽财空

360安全卫士

如何保存我们的资产

不在调上

浙江上线市场监管区块链电子取证平台,武汉出台“区块链八条”,

CECBC区块链专委会

区块链 产业落地 金融行业

原创 | 使用JPA实现DDD持久化- O:对象的世界(2/3)

编程道与术

Java hibernate DDD JDBC jpa

获得高手的精英思维,从写作开始。

叶小鍵

高手 万维钢 得到精英日课

产品经理【三句半】,说清你的【酸甜苦辣】

HPioneer

产品经理 产品设计

女博士年薪156万入职华为!网友:实力演绎美貌与智慧并存

程序员生活志

华为 少年天才

NIO的组成有哪些——奈学

奈学教育

nio

week9 学习总结

耕夫

中国四大银行正在大规模内测数字货币APP|可凭手机号完成转账

CECBC区块链专委会

数字货币 DCEP 中国人民银行

学习总结(训练营第九课)

看山是山

JVM系列之:从汇编角度分析NullCheck

程序那些事

Java JVM JIT

架构师0期第九周命题作业

何伟敏

《RabbitMQ》如何保证消息不被重复消费

Java旅途

RabbitMQ 消息队列

一文教会你嵌入式网络模块的联网操作

良知犹存

物联网 网络 嵌入式

未来云原生世界的“领头羊”:容器批量计算项目Volcano 1.0版本发布

华为云开发者社区

Kubernetes 容器 华为云 Volcano 元原生

华为云的研究成果又双叒叕被MICCAI收录了!

华为云开发者社区

机器学习 AI 计算机视觉 医疗 华为云

《深度工作》学习笔记(5)

石云升

读书笔记 专注 深度工作

EasyDL的数据集、模型与代码的版本管理:灵活管理效率提升

百度大脑

人工智能 模型训练 百度大脑

谷歌发布实验性可信类型API,用于解决跨站点脚本漏洞-InfoQ