我使用一些PHP頁面做一些AJAX的東西,但我不希望他們可以直接訪問。 Facebook做了類似的事情,例如:domain.com/ajax/my_ajax_form.php檢測如果PHP文件直接加載
如果我要使用AJAX加載該頁面,它會正常工作,但如果用戶嘗試通過鍵入直接加載文件在那個URL中,它會通過一個錯誤,例如
if(IS FILE LOADED DIRECT?)
{
header (HTTP/1.0 404);
}
我使用一些PHP頁面做一些AJAX的東西,但我不希望他們可以直接訪問。 Facebook做了類似的事情,例如:domain.com/ajax/my_ajax_form.php檢測如果PHP文件直接加載
如果我要使用AJAX加載該頁面,它會正常工作,但如果用戶嘗試通過鍵入直接加載文件在那個URL中,它會通過一個錯誤,例如
if(IS FILE LOADED DIRECT?)
{
header (HTTP/1.0 404);
}
這是不可能的。你不能依靠$_SERVER['HTTP_X_REQUESTED_WITH']
,即使你可以,也沒關係。任何人都可以通過POST
或GET
將相同的請求發送到您的瀏覽器所在的服務器。
你應該做的是驗證請求,並返回適當的結果,如果它是有效的。如果無效,請不要返回404(瀏覽器可以緩存404錯誤。如果客戶端代碼遇到問題,後續請求可能會失敗!)如果請求無效,則返回某種錯誤。
再次,它是不可能來保護這樣的東西。您應該驗證會話並請求數據。就這樣。
+1我完全同意,如果它正在被ajax請求使用,只要確保它從這個角度是安全的,並且輸出是什麼。我不會浪費時間阻止非Ajax請求。 – Jakub 2010-11-18 16:09:35
如果你能掌握所有線索,你當然可以依靠它。儘管如此,標題並不是一個標準,但通常的做法不會少。應用程序安全性應該在應用程序的較低級別處理,而不是根據訪問方法拒絕訪問資源。 – 2010-11-19 11:06:01
簡單的辦法是隻能通過POST
訪問該頁面,而不是通過GET
。雖然請記住 - 如果瀏覽器可以做到這一點 - 那麼黑客也可以。
您可以查找HTTP_X_REQUESTED_WITH
標題。
$is_ajax = array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER)
&& $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
if (! $is_ajax) {
die('go away.');
}
但請注意,它不是標準的,但需要在請求方明確設置。 AFAIK,至少jQuery和Mootools設定它,也許大多數其他人,但不要聽我的話。
您必須使用會話變量或更一般地說,Cookie。
與餅乾:(在JavaScript中集)
請注意,這是沒有辦法安全的!這只是防止輕鬆鏈接。
隨着會話變量:(在服務器端設置cookie)
此方法與用戶身份驗證一樣安全。
有什麼理由讓它限制對文件的訪問?通常直接訪問的意思是,只是調用文件'ajax.php',我會默認爲一個錯誤消息,除非他們添加GET或POST變量,比如'ajax.php?method = getData'。 – Jakub 2010-11-18 16:00:26