2011-08-19 27 views
1

可能重複:
Prevent Direct Access To File Called By ajax Function阻斷非AJAX請求到PHP

我創建依靠AJAX調用到PHP頁面的站點。有沒有辦法阻止訪問原始數據? (即通過他們自己的帖子請求訪問php文件)。

我猜想最好的方法來做到這一點(如果可能的話)將阻止PHP發送數據到任何不是來自AJAX的東西(因爲它必須來自同一個域)。有什麼建議麼?

+1

http://davidwalsh.name/detect-ajax –

+1

請注意,此方法不是100%保存。像HTTP_X_REQUESTED_WITH這樣的HTTP頭可以很容易地被欺騙。另外,這個問題之前被問到:http://stackoverflow.com/questions/1756591/php-prevent-direct-access-to-file-called-by-ajax-function – Luwe

+0

@Luwe:這個問題有什麼共同點有這個嗎? –

回答

0
if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    //allow access 
} 
else 
    die("Direct access restricted"); 

這是生成迷霧雖然

+0

有沒有一個選項不是「可作弊」?或者,如果我需要保護數據,我可能需要找到不同的解決方案? – Exupery

+1

@Exupery:不。沒有 – genesis

0

當請求沒有適當的GET或POST變量時,您可能不會返回任何內容。

這樣說,誠實地說,沒有任何事情需要擔心,因爲任何實際瀏覽你發送ajax請求的頁面的人都可能試圖做一些惡意的事情,並且他們接收通過ajax發送的內容不會獲得任何東西。沒有普通用戶每天訪問量來源...

+0

我並不擔心隨便/普通用戶。這些數據具有內在價值,所以我試圖傳播它,而不是免費贈送它。 – Exupery

0

Ajax庫在他們的請求中添加X-Requested-With: XmlHttpRequest頭,所以你可以測試它的存在:

if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XmlHttpRequest')) { 
    // not an ajax request 
} 

但是一惡意用戶也可以輕鬆地發送該頭文件,因此不要使用它來保護敏感數據。

0

由於@Evan鏈接在他的評論中,您可以通過在$_SERVER中查找HTTP_X_REQUESTED_WITH來檢測XmlHttpRequest請求。但是這個值來自客戶端發送的頭文件。與用戶的任何信息一樣,這可能是欺騙性的。

確實沒有辦法以實用的方式阻止非XmlHttpRequest。如果阻止API非常重要,那麼可以在向主頁面發出請求時向JavaScript發出唯一密鑰(並將其存儲在會話中)。它在XmlHttpRequest中傳遞,當該頁面看到它並驗證它時,它將提供訪問權限。但即使這個獨特的鑰匙可以從頁面上刮掉。

+0

我曾經想過類似的東西,但正如你指出的那樣,這不會增加很多安全性。我所尋找的可能是不可能的。 – Exupery