首先,瀏覽器渲染分以下幾步:
- 解析HTML生成DOM樹。
- 解析CSS生成CSSOM規則樹。
- 將DOM樹與CSSOM規則樹合並在一起生成渲染樹。
- 遍歷渲染樹開始布局,計算每個節點的位置大小信息。
- 將渲染樹每個節點繪制到屏幕。
已知的問題:
"" 之間的xss我們都知道可以使用偽協議,那么如果冒號或者javascript等關鍵字被過濾了我們應該如何解決?
我們可以在標簽內通過實體編碼觸發xss:
<a href="javascript:%6 1%6c%65%72%74%28%32%29">test</a>
瀏覽器遇到html標簽 會對標簽里面的實體編碼進行解碼 如果解碼后存在javascript: 則會執行js偽協議觸發xss
那么我這個菜雞開始思考,
既然實體編碼
會被html自解碼,那么為什么過濾xss的方法之一是實體編碼特殊符號呢 為什么<>的實體編碼沒有自解碼后被解析成一個新的dom節點呢?通過查詢資料我得到了一個答案
:
瀏覽器最早開始解析HTML,將標簽轉化為內容樹中的DOM 節點,此時識別標簽的時候,HTML 解析器是無法識別那些被實體編碼的內容的,只有建立起DOM 樹,才能對每個節點的內容進行識別,如果出現實體編碼,則會進行實體解碼。在此基礎上,JavaScript DOM API 參與進來,可以對DOM 樹進行修改,改變DOM樹的結構和內容。
這段話說的比較清楚了,在dom樹構建之時,html實體編碼是沒有被自解碼的,那么此時dom樹的節點結構就已經被固定了。后續自解碼以后並不會影響到dom樹/節點/標簽的結構。這個道理和sql中的預編譯是有些類似的。之后的自解碼以后獲得的<>將不會被解析成新的節點。 但並不是說dom樹構建完畢后就不能被改變了。js是可以操作節點進行增刪改操作的。