javascript
JSONP原理以及安全问题
JSONP介紹
JSONP全稱是JSON with Padding ,是基于JSON格式的為解決跨域請(qǐng)求資源而產(chǎn)生的解決方案。他實(shí)現(xiàn)的基本原理是利用了 HTML 里 元素標(biāo)簽沒有跨域限制
JSONP原理就是動(dòng)態(tài)插入帶有跨域url的script標(biāo)簽,然后調(diào)用回調(diào)函數(shù),把我們需要的json數(shù)據(jù)作為參數(shù)傳入,通過一些邏輯把數(shù)據(jù)顯示在頁面上。
比如如下代碼所示,通過script標(biāo)簽完成http://localhost:8080/test01/dom01?callback=jsontest的調(diào)用。
后端代碼:
訪問test.html頁面執(zhí)行script,請(qǐng)求http://localhost:8080/test01/dom01?callback=jsontest,然后將請(qǐng)求的內(nèi)容作為參數(shù),執(zhí)行jsontest函數(shù),jsontest函數(shù)將請(qǐng)求的內(nèi)容彈出來出來。結(jié)果如下:
這樣我們就通過script標(biāo)簽實(shí)現(xiàn)了快于請(qǐng)求,繞過了同源策略。
Ajax的jsonp跨域請(qǐng)求原理和這個(gè)是一樣的,也是在frame里面通過創(chuàng)建一個(gè)臨時(shí)的script標(biāo)簽來實(shí)現(xiàn)跨域請(qǐng)求。感興趣的同學(xué)可以自己驗(yàn)證下,操作時(shí)只需要打開瀏覽器調(diào)試工具就可以看到。
JSONP劫持
JSON劫持又稱“JSON Hijacking”,2008年國外安全研究人員開始提到由JSONP帶來的風(fēng)險(xiǎn)。這個(gè)問題屬于CSRF(Cross-site request forgery跨站請(qǐng)求偽造)攻擊范疇,當(dāng)某網(wǎng)站通過JSONP的方式跨域(一般為子域)傳遞用戶認(rèn)證后的敏感信息時(shí),攻擊者可以構(gòu)造惡意的JSONP調(diào)用頁面,誘導(dǎo)被攻擊者訪問,以達(dá)到截取用戶敏感信息的目的。如圖所示(來自參考文章)
一個(gè)典型的JSON Hijacking攻擊代碼如下:
黑客誘惑用戶去打開這個(gè)html文件,以用戶的身份去訪問http://localhost:8080/test01/dom01?callback=jsontest,然后把用戶的敏感數(shù)據(jù)通過http://172.20.10.5:8080/test01/dom02?callback=jsontest發(fā)送給黑客的服務(wù)器。
http://172.20.10.5:8080/test01/dom02的代碼如下所示:其實(shí)可以用一個(gè)map去接收數(shù)據(jù),這樣可以在不知道json的數(shù)據(jù)結(jié)構(gòu)的情況下接收數(shù)據(jù)。
JSONP劫持挖掘與防御
JSONP漏洞挖掘,首先需要盡可能的找到所有的接口,尤其是返回?cái)?shù)據(jù)格式是JSONP的接口,然后在數(shù)據(jù)包中檢索關(guān)鍵詞callback、json、jsonp、email等,觀察返回值是否變化。
JSONP劫持的防御
- 限制來源refer
- 按照J(rèn)SON格式標(biāo)準(zhǔn)輸出(設(shè)置Content-Type : application/json; charset=utf-8),預(yù)防http://127.0.0.1/getUsers.php?callback=形式的xss
- 過濾callback函數(shù)名以及JSON數(shù)據(jù)輸出,預(yù)防xss
總結(jié)
以上是生活随笔為你收集整理的JSONP原理以及安全问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: empire-web可视化
- 下一篇: 密码学基础知识(一)信息安全与密码学