[toc]
會不定時擴充與完善文章內(nèi)容
更新日期:2020年12月13日
JavaScript 是屬于 HTML 和 Web 的編程語言。
JavaScript 能夠改變 HTML 內(nèi)容。
案例:
JavaScript 能夠改變 HTML 屬性
本例通過改變 <img> 標(biāo)簽的 src 屬性(source)來改變一張 HTML 圖像:
1 2 3 4 5 6 7 8 9 10 11 | <!DOCTYPE html> <html> <body> <h2>JavaScript 能做什么?< / h2> <p>JavaScript 能夠改變 HTML 屬性值。< / p> <p>在本例中,JavaScript 改變了圖像的 src 屬性值。< / p> <button onclick = "document.getElementById('myImage').src='/i/eg_bulbon.gif'" >開燈< / button> <img id = "myImage" border = "0" src = "/i/eg_bulboff.gif" style = "text-align:center;" > <button onclick = "document.getElementById('myImage').src='/i/eg_bulboff.gif'" >關(guān)燈< / button> < / body> < / html> |
通過 HTML DOM,JavaScript 能夠訪問和改變 HTML 文檔的所有元素。
HTML DOM(文檔對象模型)
當(dāng)網(wǎng)頁被加載時,瀏覽器會創(chuàng)建頁面的文檔對象模型(Document Object Model)。
HTML DOM 模型被結(jié)構(gòu)化為對象樹:
對象的 HTML DOM 樹
通過這個對象模型,JavaScript 獲得創(chuàng)建動態(tài) HTML 的所有力量:
HTML DOM 是 HTML 的標(biāo)準(zhǔn)對象模型和編程接口,它定義了:
換言之:HTML DOM 是關(guān)于如何獲取、更改、添加或刪除 HTML 元素的標(biāo)準(zhǔn)。
HTML DOM Document 對象
1 2 | 每個載入瀏覽器的 HTML 文檔都會成為 Document 對象。 Document 對象使我們可以從腳本中對 HTML 頁面中的所有元素進行訪問。 |
HTML DOM Element 對象
1 2 3 | 在 HTML DOM 中,Element 對象表示 HTML 元素。 Element 對象可以擁有類型為元素節(jié)點、文本節(jié)點、注釋節(jié)點的子節(jié)點。 NodeList 對象表示節(jié)點列表,比如 HTML 元素的子節(jié)點集合。 |
HTML DOM Attribute 對象
1 2 | 在 HTML DOM 中,Attr 對象表示 HTML 屬性。 HTML 屬性始終屬于 HTML 元素。 |
HTML DOM Event 對象
1 2 | Event 對象代表事件的狀態(tài),比如事件在其中發(fā)生的元素、鍵盤按鍵的狀態(tài)、鼠標(biāo)的位置、鼠標(biāo)按鈕的狀態(tài)。 事件通常與函數(shù)結(jié)合使用,函數(shù)不會在事件發(fā)生前被執(zhí)行! |
學(xué)無止境
未便于理解進行了分類歸納:
1 | 發(fā)出請求時,XSS代碼出現(xiàn)在URL中,作為輸入提交到服務(wù)端,服務(wù)端解析后響應(yīng),在響應(yīng)內(nèi)容中出現(xiàn)這段XSS代碼,最后瀏覽器解析執(zhí)行。這個過程就像一次反射,故稱為反射型XSS。 |
1 | 存儲型XSS和反射型XSS的差別僅在于:提交的XSS代碼會存儲在服務(wù)端(不管是數(shù)據(jù)庫、內(nèi)存還是文件系統(tǒng)等),下次請求目標(biāo)頁面時不用再提交XSS代碼。 |
1 | DOM XSS的XSS代碼并不需要服務(wù)器解析響應(yīng)的直接參與,觸發(fā)XSS靠的就是瀏覽器端的DOM解析,可以認為完全是客戶端的事情。 |
常見危害例舉
掛馬
通過案例進行講解
在使用搜索功能時發(fā)現(xiàn)信息存在"駐留"現(xiàn)象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $( '.search-ipt' ).on( 'input' ,function () { let val = localStorage.getItem( 'record' )||'' if (val! = ''){ $( '.history' ).css( 'display' , 'block' ) $( '.history' ).html( '<a href="/?search=' + val + '">' + val + '</a>' ) } else { $( '.history' ).css( 'display' , 'none' ) } }) $( '.search-btn' ).click(function () { let val = $( '.search-ipt' ).val() localStorage.setItem( 'record' ,val) } ) 發(fā)現(xiàn)將數(shù)據(jù)存儲在localStorage |
1 | <script>alert( "xss測試" )< / script> |
發(fā)現(xiàn)輸入的數(shù)據(jù)有駐留但在標(biāo)簽內(nèi)
1 2 3 4 5 6 7 8 9 10 11 | $( '.search-ipt' ).on( 'input' ,function () { if ($( '.search-ipt' ).val() = = ''){ $( '.history' ).css( 'display' , 'none' ) } else { $( '.history' ).css( 'display' , 'block' ) } let val = $( '.search-ipt' ).val() $( '.history' ).html( '<a href="/?search=' + val + '">暫無搜索結(jié)果</a>' ) }) 發(fā)現(xiàn)取內(nèi)容放在<a標(biāo)簽內(nèi) |
正常測試,查看元素
1 2 3 4 5 6 7 8 9 10 11 12 | $( '.url-btn' ).click(function () { let val = $( '.search-ipt' ).val() if (val = = '') { $( '.url-box' ).css( 'display' , 'none' ) } else { val = val.toLocaleLowerCase().replace( / script / g,' ').replace(/</g,' ').replace(/>/g,' ') $( '.url-box' ).css( 'display' , 'block' ) $( '.url-box' ).html( '<span style="padding-left: 2px">生成的鏈接為:<a class="url" href="' + val + '">' + val + '</a></span>' ) } } ) 發(fā)現(xiàn)將數(shù)據(jù)存儲在<a標(biāo)簽href屬性內(nèi) |
1 2 | <a> 標(biāo)簽的 href 屬性用于指定超鏈接目標(biāo)的 URL。 href 屬性的值可以是任何有效文檔的相對或絕對 URL,包括片段標(biāo)識符和 JavaScript 代碼段。如果用戶選擇了 <a> 標(biāo)簽中的內(nèi)容,那么瀏覽器會嘗試檢索并顯示 href 屬性指定的 URL 所表示的文檔,或者執(zhí)行 JavaScript 表達式、方法和函數(shù)的列表。 |
HTML DOM Event 對象
1 | Event 對象代表事件的狀態(tài),比如事件在其中發(fā)生的元素、鍵盤按鍵的狀態(tài)、鼠標(biāo)的位置、鼠標(biāo)按鈕的狀態(tài)。 |
事件句柄 (Event Handlers)
1 | HTML 4.0 的新特性之一是能夠使 HTML 事件觸發(fā)瀏覽器中的行為,比如當(dāng)用戶點擊某個 HTML 元素時啟動一段 JavaScript。下面是一個屬性列表,可將之插入 HTML 標(biāo)簽以定義事件的行為。 |
事件通常與函數(shù)結(jié)合使用,函數(shù)不會在事件發(fā)生前被執(zhí)行!
onmouseover 事件會在鼠標(biāo)指針移動到指定的對象上時發(fā)生
1 2 3 4 5 6 7 | 支持該事件的 HTML 標(biāo)簽: <a>, <address>, <area>, <b>, <bdo>, <big>, <blockquote>, <body>, <button>, <caption>, <cite>, <code>, <dd>, <dfn>, <div>, <dl>, <dt>, <em>, <fieldset>, <form>, <h1> to <h6>, <hr>, <i>, <img>, < input >, <kbd>, <label>, <legend>, <li>, < map >, <ol>, <p>, <pre>, <samp>, <select>, <small>, <span>, <strong>, <sub>, <sup>, <table>, <tbody>, <td>, <textarea>, <tfoot>, <th>, <thead>, <tr>, <tt>, <ul>, <var> |
1 | "><script>alert( 1 )< / script> |
測試發(fā)現(xiàn)輸入內(nèi)容被過濾
換測試代碼
1 | " onclick=" alert( 1 ) |
未過濾但未成功閉合
1 2 3 4 | let query = getParam( 'query' )||'' if (query){ query = query.replace( / <|>|script / g,'').substring( 0 , 33 ) 看到使用了query參數(shù),其值為getParam( 'query' ) |
1 2 3 4 5 6 | function getParam(name) { if (location.search! = ''){ let param = new URLSearchParams(location.search) return decodeURI(param.get(name)) } 若鏈接中存在參數(shù),則創(chuàng)建一個對象,值為所有參數(shù),name對應(yīng)參數(shù)名 |
1 | "%20onclick=" eval (getParam(Test))"&Test = 其它代碼 |
成功引用。已打破輸入長度限制
1 | " " onclonclickick=" alert( 1 )" |
被過濾,發(fā)現(xiàn)onclick被過濾成立空字符
1 | " " onclonclickick=" alert( 1 )" |
過濾一個在加一個
測試成功