日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

web安全---浏览器解析提交数据的过程

發(fā)布時間:2023/12/1 HTML 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 web安全---浏览器解析提交数据的过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

解碼規(guī)則

  • html解析器對html文檔進行解析,完成解析并創(chuàng)建DOM樹
  • JavaScript或者CSS解析器對內(nèi)聯(lián)腳本進行解析,完成js、css解碼
  • url解碼會根據(jù)url所在的順序不同而在JS解碼或者解碼后
  • 解碼順序

    html解析第一步執(zhí)行,而JS解析和URL解析則要根據(jù)情況而定

    HTML解析器

    1、html解析器以狀態(tài)機的方式運行

    狀態(tài)流程圖為:

    即:Data—》Tag open----》Tag name —》Data

    注意:如果我們的標(biāo)簽是在Data狀態(tài)下被解析出來的,那么標(biāo)簽將作為一種文本輸出來,
    舉例:<p>Hello<p>
    初始狀態(tài)為Data state ,當(dāng)遇到<時,狀態(tài)轉(zhuǎn)為 Tag open,讀取a-z某個字符創(chuàng)建開始標(biāo)簽,然后狀態(tài)變?yōu)門ag name ,知道讀取到>,狀態(tài)變?yōu)镈ata,接著讀取到H會識別并生成一個字符,相應(yīng)得會為Hello中的每個字符生成一個字符符號,之后遇到<,又變?yōu)門ag open,讀取到/則會創(chuàng)建一個閉合標(biāo)簽,并將狀態(tài)改為Tag name,直到遇到>,后回到Data state。

    注意:HTML解析器處于Data State、RCDATA State 、Attribute Value State(屬性值),字符實體會被解碼為對應(yīng)的字符

    2、原始文本元素

    特性:該元素標(biāo)簽中的實體不會被HTML解碼
    標(biāo)簽:script,style
    舉例:標(biāo)簽中的實體字符不會被html解碼,因此不會執(zhí)行js

    <script>alert&#40;&#49;&#41;</script>
    3、RCDATA 元素

    特性:html解析器遇到該元素標(biāo)簽時,會進入RCDATA狀態(tài),實體字符會被解析器解碼
    標(biāo)簽:textarea、title
    舉例:字符實體會被解碼,但是不會執(zhí)行JS,因為沒有進入Tag open狀態(tài),其中<script>不會被解釋為HTML標(biāo)簽

    <textarea>&lt;script&gt;alert&#40;&#49;&#41;&lt;/script></textarea> 解碼得到<textarea><script>alert(1)</script></textarea>

    JavaScript解析器

    JavaScript中有三個地方可以出現(xiàn)JS編碼
    1、字符串

    <script>alert(“\u0031);</script> 被編碼的為1且是字符串,可以正常解碼并觸發(fā)執(zhí)行

    2、標(biāo)識符

    <script>\u0061\u006c\u0065\u0072\u0074(1);</script> 被編碼的部分為alert字符,是函數(shù)名,屬于在標(biāo)識符中的情況,因此會被正常解碼并執(zhí)行JS

    3、控制符
    包含:單引號、雙引號、括號等
    特性:能被解碼但不會解釋為控制字符,即失去特殊意義,只會被當(dāng)做標(biāo)識符或字符串的一部分

    <script>alert\u0028″xss”);</script> \u0028會被解碼為( 但是不會觸發(fā)JS,因為是控制符

    URL解析器

    1、URL的協(xié)議部分必須為ASCII字符、否則URL解析器的狀態(tài)機將進入No Scheme狀態(tài)

    <a href="%6a%61%76%61%73%63%72%69%70%74:alert(1)"></a> url編碼部分為javascript,因為作為協(xié)議部分的"javascript"被編碼,故不會觸發(fā)JS

    2、url中的:符號不能被以任何形式編碼

    <a href="javascript%3aalert(1)"></a> :被url編碼為%3a,導(dǎo)致url狀態(tài)機進入No Scheme狀態(tài),故不會觸發(fā)JS

    3、當(dāng)javascript沒有被編碼時

    <a href = "javascript:alert(3)">hhhhh<a>

    JS編碼:

    <a href="javascript:\u0061\u006c\u0065\u0072\u0074(3)">hhhhhh</a>

    再對JS編碼來一個URL編碼

    <a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(3)">hhhhhh</a>

    這個是可以成功執(zhí)行的,當(dāng)HTML解析到href時,交給URL處理,URL發(fā)現(xiàn)了javascript:,把后面的數(shù)字解碼后交由JavaScript處理,所以會彈出

    例子

    <a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">hhhh</a> URL encoded "javascript:alert(1)" //冒號(:)沒有被編碼 Answer: The javascript will NOT execute.

    HTML沒有編碼,不用考慮,根據(jù)href,URL模塊處理,但是協(xié)議沒辦法識別(即編碼的JavaScript:),URL會解碼出來,但JS不會被執(zhí)行,所以url編碼的XSS,javascript:一定不能被url編碼,編碼后無法識別,js還是不能執(zhí)行

    <a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29"> Character entity encoded "javascript" and URL encoded "alert(2)" Answer: The javascript will execute

    HTML先解碼得到:

    <a href="javascript:%61%6c%65%72%74%28%32%29">

    href中為URL,URL模塊可識別為javascript協(xié)議,進行URL解碼,得到

    <a href="javascript:alert(2)">

    由于是javascript協(xié)議,解碼完給JS模塊處理,于是被執(zhí)行

    <div>&#60;img src=x οnerrοr=alert(4)&#62;</div> Character entity encoded < and > Answer: The javascript will NOT execute.

    當(dāng)HTML解析到&#60;時,此時的狀態(tài)為Data,會被解碼,但是不能創(chuàng)建img標(biāo)簽,因為不是Tag open狀態(tài),所以解碼后被當(dāng)做文本,不會執(zhí)行

    <button onclick="confirm('7&#39;);">Button</button> Character entity encoded ' Answer: The javascript will execute.

    這里onclick中為標(biāo)簽的屬性值,會被HTML解碼,得到

    <button onclick="confirm('7');">Button</button>

    然后被執(zhí)行

    <button onclick="confirm('8\u0027);">Button</button> Unicode escape sequence encoded ' Answer: The javascript will NOT execute.

    不需要HTML解碼,onclick中的值會交給JS處理,在JS中只有字符串和標(biāo)識符能用Unicode表示,'顯然不行,JS執(zhí)行失敗。

    <script>&#97;&#108;&#101;&#114;&#116&#40;&#57;&#41;&#59</script> Character entity encoded alert(9); Answer: The javascript will NOT execute.

    不會被執(zhí)行,script屬于原始文本元素(Raw text elements),只可以容納文本,注意沒有字符引用,于是直接由JS處理,JS也認(rèn)不出來,執(zhí)行失敗

    參考鏈接

    https://blog.csdn.net/baidu_38844729/article/details/109328472
    https://xz.aliyun.com/t/5863

    總結(jié)

    以上是生活随笔為你收集整理的web安全---浏览器解析提交数据的过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。