所以我有一個主頁從JSON鏈接獲取數據並根據這些數據填充下拉菜單。我的問題是,目前任何人都可以訪問json打印到的URL,並且我想要保護它,以便只有服務器和服務器上運行的頁面才能訪問JSON輸出。如何保護json
我在考慮比較remote_addr和server_addr等PHP服務器變量,但remote_addr是客戶端IP而不是服務器。
這樣做的好方法是什麼?
感謝
所以我有一個主頁從JSON鏈接獲取數據並根據這些數據填充下拉菜單。我的問題是,目前任何人都可以訪問json打印到的URL,並且我想要保護它,以便只有服務器和服務器上運行的頁面才能訪問JSON輸出。如何保護json
我在考慮比較remote_addr和server_addr等PHP服務器變量,但remote_addr是客戶端IP而不是服務器。
這樣做的好方法是什麼?
感謝
你提到的安全問題被稱爲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劫持有效。
總之:不可能。 – Jon 2013-02-11 22:51:34
您如何驗證/授權用戶?如果有一個認證cookie,我想這個cookie會包含在AJAX請求中,對嗎?你會基於此來驗證。 – David 2013-02-11 22:52:11
請勿公開您的API。忘記用PHP代碼做這件事吧;在防火牆/ DNS /基礎設施級別保持端口和路由關閉。 – 2013-02-11 22:53:35