1. 程式人生 > >xss和實體編碼的一點小思考

xss和實體編碼的一點小思考

首先,瀏覽器渲染分以下幾步:

  1. 解析HTML生成DOM樹。
  2. 解析CSS生成CSSOM規則樹。
  3. DOM樹與CSSOM規則樹合併在一起生成渲染樹。
  4. 遍歷渲染樹開始佈局,計算每個節點的位置大小資訊。
  5. 將渲染樹每個節點繪製到螢幕。

已知的問題:

"" 之間的xss我們都知道可以使用偽協議,那麼如果冒號或者javascript等關鍵字被過濾了我們應該如何解決?

我們可以在標籤內通過實體編碼觸發xss:
<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;%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是可以操作節點進行增刪改操作的。