2009-09-08 86 views
9

我最近開始在PHP中大量使用AJAX支持的腳本,事實上,被AJAX調用訪問的文件也可以直接使用,如何禁用?AJAX只能訪問

回答

21

你不能可靠地防止這種情況發生。關鍵並不是認爲有人直接將此文件作爲安全問題進行訪問 - 爲此做好準備,您將處於更安全的地方。

有些人可能會建議的代碼看起來像這樣(或類似):

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) 
    && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    // more code here 
} 

然而,事情的事實是,HTTP頭可以很容易地欺騙,並且不保證代碼的一種手段。在我在一個繁忙的網站上測試後,我發現這些頭文件實際上並不那麼可靠。

+0

現貨。或者,您可以傳遞一個參數(例如'?ajax'),但這更容易被欺騙。 –

0

沒有辦法直接禁止訪問。由於查詢總是可以根據您提出的任何標準進行匹配。

如果正在使用XMLHttpRequest來查詢它增加了可以使用的東西等檢測頭的服務器:

/* AJAX check */ 
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    //Do something here 
} 
-1

使用會話的應用程序中。

編輯:

  1. 註冊你的網站在一個會議上,我使用該UUID的。

  2. 設置一個cookie,其值與會話中使用的值相同。

  3. 用包含此值的參數發送您的AJAX請求。

  4. 比較來自會話,cookie和參數的值。

+0

我的回答有什麼問題? – Joerg

+0

我沒有投票給你,但這仍然沒有可靠的辦法。實施可能相當方便,但也可能被欺騙。 – Boldewyn

6

正如其他人在他們的回覆中所建議的,這是不可能的。這是因爲計算機安全的一個主要原則:你永遠不能相信客戶。這就是爲什麼我們驗證來自客戶端的所有輸入等。

而不是試圖阻止其他客戶端訪問您的服務,而是花時間編寫防禦性Web服務。意思是,確保惡意用戶不能通過業務邏輯進行注射或其他攻擊。例如,確保所有電子郵件都是有效的,人們不會購買負面美元等物品等。

哦,而且網絡服務是開放的事實是一件好事!您爲用戶提供了一個開放的API,非常整潔!也許不是試圖鎖定你的社區,而是讓你接受它 - 給他們一些關於如何與你的服務接口的文檔,他們會創造更多的客戶。與其購買iPhone SDK並花時間學習Objective C,您的一位用戶可能會這樣做。

+1

這是可能的,但不可靠。除此之外,所有有效的點 –

0

也許你應該使用一些XSS防禦技術,比如傳遞一些安全密鑰以及ajax請求。只給JavaScript的關鍵,使加載頁面的異步查詢。

<script type="text/javascript"> 
    window.csrf_key = '<?php $user->getCsrf(); ?>'; 
</script> 

在這種情況下,你會不會擔心路過的人請求直接將文件,只要你保持安全的密鑰,用木樁來調用的行動,做完整性檢查。