2010-11-18 29 views
0

我使用一些PHP頁面做一些AJAX的東西,但我不希望他們可以直接訪問。 Facebook做了類似的事情,例如:domain.com/ajax/my_ajax_form.php檢測如果PHP文件直接加載

如果我要使用AJAX加載該頁面,它會正常工作,但如果用戶嘗試通過鍵入直接加載文件在那個URL中,它會通過一個錯誤,例如

if(IS FILE LOADED DIRECT?) 
{ 
header (HTTP/1.0 404); 
} 
+0

有什麼理由讓它限制對文件的訪問?通常直接訪問的意思是,只是調用文件'ajax.php',我會默認爲一個錯誤消息,除非他們添加GET或POST變量,比如'ajax.php?method = getData'。 – Jakub 2010-11-18 16:00:26

回答

5

這是不可能的。你不能依靠$_SERVER['HTTP_X_REQUESTED_WITH'],即使你可以,也沒關係。任何人都可以通過POSTGET將相同的請求發送到您的瀏覽器所在的服務器。

你應該做的是驗證請求,並返回適當的結果,如果它是有效的。如果無效,請不要返回404(瀏覽器可以緩存404錯誤。如果客戶端代碼遇到問題,後續請求可能會失敗!)如果請求無效,則返回某種錯誤。

再次,它是不可能來保護這樣的東西。您應該驗證會話並請求數據。就這樣。

+1

+1我完全同意,如果它正在被ajax請求使用,只要確保它從這個角度是安全的,並且輸出是什麼。我不會浪費時間阻止非Ajax請求。 – Jakub 2010-11-18 16:09:35

+0

如果你能掌握所有線索,你當然可以依靠它。儘管如此,標題並不是一個標準,但通常的做法不會少。應用程序安全性應該在應用程序的較低級別處理,而不是根據訪問方法拒絕訪問資源。 – 2010-11-19 11:06:01

2

簡單的辦法是隻能通過POST訪問該頁面,而不是通過GET。雖然請記住 - 如果瀏覽器可以做到這一點 - 那麼黑客也可以。

5

您可以查找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設定它,也許大多數其他人,但不要聽我的話。

1

您必須使用會話變量或更一般地說,Cookie。

與餅乾:(在JavaScript中集)

  1. 的JavaScript:在cookie中設置令牌
  2. 的JavaScript:請XMLHttpRequest的
  3. 服務器端:從餅乾
  4. 服務器端檢查令牌:返回JSON輸出或錯誤信息

請注意,這是沒有辦法安全的!這只是防止輕鬆鏈接。

隨着會話變量:(在服務器端設置cookie)

  1. 服務器端:驗證用戶,設定權限
  2. 的JavaScript:請XMLHttpRequest的
  3. 服務器端:檢查權限
  4. 服務器方:返回JSON輸出或錯誤信息

此方法與用戶身份驗證一樣安全。