2013-02-11 131 views
1

所以我有一個主頁從JSON鏈接獲取數據並根據這些數據填充下拉菜單。我的問題是,目前任何人都可以訪問json打印到的URL,並且我想要保護它,以便只有服務器和服務器上運行的頁面才能訪問JSON輸出。如何保護json

我在考慮比較remote_addr和server_addr等PHP服務器變量,但remote_addr是客戶端IP而不是服務器。

這樣做的好方法是什麼?

感謝

+3

總之:不可能。 – Jon 2013-02-11 22:51:34

+1

您如何驗證/授權用戶?如果有一個認證cookie,我想這個cookie會包含在AJAX請求中,對嗎?你會基於此來驗證。 – David 2013-02-11 22:52:11

+1

請勿公開您的API。忘記用PHP代碼做這件事吧;在防火牆/ DNS /基礎設施級別保持端口和路由關閉。 – 2013-02-11 22:53:35

回答

1

你提到的安全問題被稱爲JSON hijacking,而和一些瀏覽器現在包含features to mitigate the risk,它仍然是在其他瀏覽器的問題。

幸運的是有一個相當簡單的解決方案。爲了理解它,我們需要首先了解攻擊是如何工作的。
實際上,第三方站點通過XMLHTTPRequest請求您的JSON文件並以正常方式解析它實際上是不可能的,因爲這可能會被同源策略阻止。
因此,攻擊者所做的是重新定義JavaScript中的對象設置器函數,以便將任何新對象的值返回給自己的代碼,然後創建一個引用JSON文件的新標記<script>。當JSON加載時,瀏覽器將執行它,創建一個新對象,並將值返回給攻擊者的對象設置處理程序。攻擊者現在擁有你的數據。

爲了防止出現這種情況,您需要做的是不能直接將JavaScript代碼解析爲JSON代碼。如果這樣做,你想讓它發出錯誤。
實現此功能的一種常見方式(由Google和Facebook等網站使用)是將代碼添加到JSON文件的開頭,這會創建一個無限循環,阻止解析器到達其餘代碼(並拋出一個JavaScript錯誤)。

例如,Facebook的JSON響應以字符串for(;;);開始,而谷歌使用的代碼,例如while(1);,和throw(1); <don't be evil>各種位(後者簡單地直接將引發錯誤,而不是創建無限循環)。

然後,您還需要修改自己的JSON處理JavaScript,以便在解析它之前去除這個殘缺。例如,你可以這樣做:

function parseJSON(json) { 
    json = json.replace("for(;;);", ""); 
    /* parse your JSON as usual */ 
} 

這增加了克魯夫特,以你的腳本和你的JSON的一點點,但在防止JSON劫持有效。