Sanitizer(给你的DOM消消毒)
大家好,我卡颂。
业务中经常遇到需要处理有风险的DOM的场景,比如:
- 各种工具的文本粘贴功能
- 需要渲染服务端返回
HTML
的场景
XSS
攻击,有两个选择:escape
(转义)sanitize
(消毒)
DOM
消毒的API
—— Sanitizer
。![Sanitizer(给你的DOM消消毒)](https://img.it610.com/image/info9/4eef8b5a67644369bc87c3579f40d331.jpg)
文章图片
本文内容来自 Safe DOM manipulation with the Sanitizer API转义与消毒 假设,我们想将这样一段
HTML
字符串插入DOM
:const str = "
文章图片
默认情况下Sanitizer
会移除所有可能导致JS
执行的代码。
丰富的配置
Sanitizer
不仅开箱即用,还提供丰富的白名单、黑名单配置:
const config = {
allowElements: [],
blockElements: [],
dropElements: [],
allowAttributes: {},
dropAttributes: {},
allowCustomElements: true,
allowComments: true
};
new Sanitizer(config)
比如,allowElements
定义元素白名单,只有名单内的元素会被保留,与之对应的blockElements
是元素黑名单:
const str = `hello world`new Sanitizer().sanitizeFor("div", str)
// hello worldnew Sanitizer({allowElements: [ "b" ]}).sanitizeFor("div", str)
// hello worldnew Sanitizer({blockElements: [ "b" ]}).sanitizeFor("div", str)
// hello worldnew Sanitizer({allowElements: []}).sanitizeFor("div", str)
// hello world
allowAttributes
是属性白名单,与之对应的dropAttributes
是属性黑名单,对于如下配置:
{
allowAttributes: {"style": ["span"]},
dropAttributes: {"id": ["*"]}}
}
代表消毒后的HTML
:
- 只允许
span
元素拥有style
属性
- 移除所有元素(
*
通配符代表所有元素)的id
属性
文章图片
兼容性
这么香的API
兼容性怎么样呢:
文章图片
文章图片
当前只有在Chrome 93
之后,开启试验标识后可使用:
about://flags/#enable-experimental-web-platform-features
虽然原生Sanitizer
离稳定还遥遥无期,但你可以使用DOMPurify库实现类似功能。
后记
日常你更倾向使用escape
还是sanitize
呢?
【Sanitizer(给你的DOM消消毒)】欢迎加入人类高质量前端框架研究群,带飞
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 为什么你的路演总会超时()
- 奔向你的城市
- 喂,你结婚我给你随了个红包
- 成交的种子咖啡冥想
- 一百二十三夜,请嫁给我
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 历史教学书籍
- 我来海边捡贝壳
- 写给陈羡