jQuery使用中可能被XSS攻擊的一些危險(xiǎn)環(huán)節(jié)提醒
$
我們經(jīng)常使用向 $ 內(nèi)傳入一個(gè)字符串的方式來選擇或生成 DOM 元素,但如果這個(gè)字符串是來自用戶輸入的話,那么這種方式就是有風(fēng)險(xiǎn)的。
先看一個(gè) DEMO:http://jsbin.com/duwuzonife/1/edit?html,js,output
$("<img src='' onerror='alert();'>");
當(dāng)用戶輸入的字符串是像這樣的時(shí),雖然這個(gè) <img> 元素不會(huì)馬上被插入到網(wǎng)頁的 DOM 中,但這個(gè) DOM 元素已經(jīng)被創(chuàng)建了,并且暫存在內(nèi)存里。而對(duì)于 <img> 元素,只要設(shè)置了它的 src 屬性,瀏覽器就會(huì)馬上請(qǐng)求 src 屬性所指向的資源。我們也可以利用這個(gè)特性做圖片的預(yù)加載。在上面的示例代碼中,創(chuàng)建元素的同時(shí),也設(shè)置了它的屬性,包括 src 屬性和 onerror 事件監(jiān)聽器,所以瀏覽器會(huì)馬上請(qǐng)求圖片資源,顯然請(qǐng)求不到,隨機(jī)觸發(fā) onerror 的回調(diào)函數(shù),也就執(zhí)行了 JavaScript 代碼。
推薦閱讀 $ 的官方文檔:http://api.jquery.com/jQuery/
類似的其他方法
.after() .append() .appendTo() .before() .html() .insertAfter() .insertBefore() .prepend() .prependTo() .replaceAll() .replaceWith() .unwrap() .wrap() .wrapAll() .wrapInner() .prepend()
以上這些方法不僅創(chuàng)建 DOM 元素,并且會(huì)馬上插入到頁面的 DOM 樹中。如果使用 <script> 標(biāo)簽插入了內(nèi)聯(lián) JS 會(huì)立即執(zhí)行。
不安全的輸入來源
document.URL * document.location.pathname * document.location.href * document.location.search * document.location.hash document.referrer * window.name document.cookie
document 的大多數(shù)屬性都可以通過全局的 window 對(duì)象訪問到。加 * 的屬性返回的時(shí)編碼 (urlencode) 后的字符串,需要解碼才可能造成威脅。
不安全的操作
把可以被用戶編輯的字符串,用在以下場(chǎng)景中,都是有隱患的??傮w來說,任何把字符串作為可執(zhí)行的代碼的操作,都是不安全的。
1.通過字符串創(chuàng)建函數(shù)
(1)eval
(2)new Function
(3)setTimeout/setInterval
2.跳轉(zhuǎn)頁面
location.replace/location.assign
修改 <script> 標(biāo)簽的 src 屬性
修改事件監(jiān)聽器
總結(jié)
如果發(fā)生在用 jQuery 時(shí)被 DOM-XSS 攻擊的情況,大多是因?yàn)楹鲆暳藘蓚€(gè)東西:
1. 在給$傳參數(shù)時(shí),對(duì)參數(shù)來源的把控。
2. 用戶的輸入途徑不只有表單,還有地址欄,還可以通過開發(fā)者工具直接修改 DOM ,或者直接在控制臺(tái)執(zhí)行 JS 代碼。
相關(guān)文章
jQuery ui autocomplete選擇列表被Bootstrap模態(tài)窗遮擋的完美解決方法
這篇文章主要介紹了jQuery ui autocomplete選擇列表被Bootstrap模態(tài)窗遮擋的完美解決方法,本文介紹的非常詳細(xì),解決過程思路明了,需要的朋友可以參考下2016-09-09jQuery EasyUI API 中文文檔 - DataGrid數(shù)據(jù)表格
jQuery EasyUI API 中文文檔 - DataGrid數(shù)據(jù)表格使用說明,需要的朋友可以參考下。2011-11-11用Juery網(wǎng)頁選項(xiàng)卡實(shí)現(xiàn)代碼
現(xiàn)在jquery比較流行,很多的選項(xiàng)卡效果可以通過jquery來實(shí)現(xiàn)。2011-06-06jquery動(dòng)態(tài)添加元素事件失效問題解決方法
當(dāng)使用腳本動(dòng)態(tài)添加元素xxx時(shí),但事件失效,最后使用jquery中on方法解決腳本動(dòng)態(tài)添加元素,需要的朋友可以參考下2014-05-05jQuery實(shí)現(xiàn)可編輯表格并生成json結(jié)果(實(shí)例代碼)
這篇文章主要介紹了 jquery實(shí)現(xiàn)可編輯表格并生成json結(jié)果,該代碼解析和加載功能都用前端js實(shí)現(xiàn),簡化了后臺(tái)代碼邏輯,非常不錯(cuò),具有參考借鑒加載,需要的朋友可以參考下2017-07-07基于jQuery實(shí)現(xiàn)Ajax驗(yàn)證用戶名是否可用實(shí)例
這篇文章主要為大家詳細(xì)介紹了基于jQuery實(shí)現(xiàn)Ajax驗(yàn)證用戶名是否可用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Jquery屬性的獲取/設(shè)置及樣式添加/刪除操作技巧分析
這篇文章主要介紹了Jquery屬性的獲取/設(shè)置及樣式添加/刪除操作技巧,結(jié)合實(shí)例形式分析了jquery針對(duì)屬性與樣式的相關(guān)獲取、設(shè)置、添加、刪除等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-12-12