成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Sanitizer:給你的DOM消消毒

開發 前端
業務中經常遇到需要處理「有風險的DOM」的場景,本文會介紹這兩者的區別以及為DOM消毒的API —— Sanitizer。

[[428805]]

大家好,我卡頌。

業務中經常遇到需要處理「有風險的DOM」的場景,比如:

  • 各種工具的文本粘貼功能
  • 需要渲染服務端返回HTML的場景

為了阻止潛在的XSS攻擊,有兩個選擇:

  • escape(轉義)
  • sanitize(消毒)

本文會介紹這兩者的區別以及為DOM消毒的API —— Sanitizer。

[[428806]]

本文內容來自Safe DOM manipulation with the Sanitizer API[1]

轉義與消毒

假設,我們想將這樣一段HTML字符串插入DOM:

  1. const str = "<img src='' onerror='alert(0)'>"

如果直接將其作為某個元素的innerHTML,img的onerror回調執行JS代碼的能力會帶來XSS風險。

一種常見解決方案是:轉義字符串。

什么是escape

瀏覽器會將一些保留字符解析為HTML代碼,比如:

  • <被解析為標簽的開頭
  • >被解析為標簽的結尾
  • ''被解析為屬性值的開頭和結尾

為了將這些保留字符顯示為文本(不被解析為HTML代碼),可以將其替換為對應的entity(HTML實體):

  • <的實體為<
  • >的實體為>
  • ''的實體為"

這種將HTML字符替換為entity的方式被稱為escape(轉義)

什么是sanitize

對于上面的HTML字符串:

  1. const str = "<img src='' onerror='alert(0)'>"

除了轉義''來規避XSS風險,還有一種更直觀的思路:直接過濾掉onerror屬性。

這種直接移除HTML字符串中有害的代碼(比如<script>)的方式被稱為sanitize(消毒)

需要用到一個API——Sanitizer[2]。

首先我們通過Sanitizer構造實例:

  1. const sanitizer = new Sanitizer(); 

調用實例的sanitizeFor方法,傳入容器元素類型以及要消毒的HTML字符串:

  1. sanitizer.sanitizeFor("div", str); 

會得到一個HTMLDivElement(即我們傳入的容器元素類型),其內部包含一個沒有onerror屬性的img:

默認情況下Sanitizer會移除所有可能導致JS執行的代碼。

豐富的配置

Sanitizer不僅開箱即用,還提供豐富的白名單、黑名單配置:

  1. const config = { 
  2.   allowElements: [], 
  3.   blockElements: [], 
  4.   dropElements: [], 
  5.   allowAttributes: {}, 
  6.   dropAttributes: {}, 
  7.   allowCustomElements: true
  8.   allowComments: true 
  9. }; 
  10.  
  11. new Sanitizer(config) 

比如,allowElements定義元素白名單,只有名單內的元素會被保留,與之對應的blockElements是元素黑名單:

  1. const str = `hello <b><i>world</i></b>` 
  2.  
  3. new Sanitizer().sanitizeFor("div", str) 
  4. // <div>hello <b><i>world</i></b></div> 
  5.  
  6. new Sanitizer({allowElements: [ "b" ]}).sanitizeFor("div", str) 
  7. // <div>hello <b>world</b></div> 
  8.  
  9. new Sanitizer({blockElements: [ "b" ]}).sanitizeFor("div", str) 
  10. // <div>hello <i>world</i></div> 
  11.  
  12. new Sanitizer({allowElements: []}).sanitizeFor("div", str) 
  13. // <div>hello world</div> 

allowAttributes是屬性白名單,與之對應的dropAttributes是屬性黑名單,對于如下配置:

  1.   allowAttributes: {"style": ["span"]}, 
  2.   dropAttributes: {"id": ["*"]}} 

代表消毒后的HTML:

  • 只允許span元素擁有style屬性
  • 移除所有元素(*通配符代表所有元素)的id屬性

兼容性

這么香的API兼容性怎么樣呢:

當前只有在Chrome 93之后,開啟試驗標識后可使用:

 

  1. about://flags/#enable-experimental-web-platform-features 

雖然原生Sanitizer離穩定還遙遙無期,但你可以使用DOMPurify[3]庫實現類似功能。

后記

日常你更傾向使用escape還是sanitize呢?

參考資料

[1]Safe DOM manipulation with the Sanitizer API:

https://web.dev/sanitizer/

[2]Sanitizer:

https://wicg.github.io/sanitizer-api/

[3]DOMPurify:

https://github.com/cure53/DOMPurify

 

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2020-03-19 15:32:47

手機消毒病毒

2013-08-15 13:17:17

2017-08-16 01:01:12

anitizerAndroidBug

2015-07-30 11:36:48

Xcode7ClangAddress San

2020-03-25 20:31:23

物聯網無人機技術

2010-09-09 17:19:07

HTML DOMXML DOM

2010-09-28 10:24:50

HTML DOMXML DOM

2010-09-28 11:11:23

XML DOMHTML DOM

2021-01-18 07:15:22

虛擬DOM真實DOMJavaScript

2020-06-12 09:56:14

數據中心疫情技術

2022-05-06 19:42:53

DOM

2020-09-06 22:59:35

Linux文件命令

2017-01-15 10:22:49

安全可視化迪普科技信息安全

2015-04-16 16:58:39

2021-01-11 07:51:16

DOM對象節點樹

2017-07-19 14:26:01

前端JavaScriptDOM

2022-07-01 07:31:18

AhooksDOM場景

2020-06-18 15:16:09

黑客網絡安全網絡間諜

2023-01-30 16:21:24

Linux外觀

2010-09-28 15:27:09

JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品综合 | 国产精品亚洲片在线播放 | 日日干综合 | 日本成人中文字幕 | 狠狠的干狠狠的操 | 国产日韩欧美 | 国产亚洲精品久久午夜玫瑰园 | 国产97视频在线观看 | 久久久久国产精品 | 国产精品久久久久一区二区三区 | 91视频免费 | 亚洲欧美在线观看 | 亚洲成人免费 | 国产重口老太伦 | 国产精品久久亚洲 | 精品美女视频在线观看免费软件 | av大片 | 在线黄av| 看羞羞视频免费 | 欧美日韩亚洲国产 | 日韩中文字幕视频 | 夜夜夜久久久 | 国产一区亚洲二区三区 | 久久久久国产精品一区二区 | 欧美综合一区二区三区 | m豆传媒在线链接观看 | 一级a性色生活片久久毛片波多野 | 97精品国产手机 | 久久久久久国 | 久久久久国产精品一区二区 | 成人一区二区在线 | 狠狠干在线 | 国产精品久久久久久吹潮 | 麻豆精品久久久 | 国精产品一品二品国精在线观看 | 免费观看羞羞视频网站 | 国产不卡在线观看 | 欧美区在线 | 日日日日操| 国产不卡一 | 久久成人国产 |