2012-04-20 47 views
2

如何驗證用戶是否使用XMLHttpRequest發佈了一些數據到PHP?如何驗證是否設置了「php:// input」而不是空

這是最好的方法?如果不是,我該如何做到這一點?

我有如下代碼

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') { 
    // PROBABLY AJAX REQUEST 
} 

我的問題是,我怎麼能驗證php://input存在,是不是空的?我認爲,後續的代碼做的工作,但需要知道這是否是一個正確的方法:

if(file_get_contents("php://input") == '') { 
    // HAVE NOT POSTED 
} else { 
    // POSTED 
} 

回答

4

將自定義標頭設置爲您的AJAX函數的一部分,並檢查服務器端代碼中是否存在該標頭。

也許最好的辦法是在服務器端生成一個密鑰,將其傳遞給包含AJAX調用的客戶端代碼,然後讓AJAX將其發送回服務器並驗證它是一個有效的密鑰。這是防止有人僞造AJAX請求的最有效方法。


要檢查php://input存在,並且不爲空,使用此:

$phpinput = file_get_contents("php://input"); 
// From the docs: "Note: A stream opened with php://input can only be read once" 
if(!$phpinput) { 
    // phpinput is empty 
} 
+0

請參閱更新的問題。 – 2012-04-20 22:04:37

+1

查看更新回答:) – 2012-04-20 22:06:38

+0

當我這樣做:'file_get_contents(「php:// input」);'我不能再寫一次,因爲流將不可用? – 2012-04-20 22:08:59

2

你是不是100%保證能夠確定一個腳本是否要求與XMLHttpRequest。您可以檢查_SERVER['HTTP_X_REQUESTED_WITH'],但這不能保證在您需要時設定或在您不需要時設定。不過,您可以嘗試一下。

+0

好吧,我有'如果(isset($ _ SERVER [ 'HTTP_X_REQUESTED_WITH'])&&用strtolower($ _ SERVER [」 HTTP_X_REQUESTED_WITH'])==='xmlhttprequest'){',我的問題是,我如何驗證'php:// input'是否存在並且不是空的? – 2012-04-20 21:58:36

+0

查看更新的問題,請 – 2012-04-20 22:06:39

+0

數據應該通過普通的'_POST'或'_GET'發送..你爲什麼需要使用stdin? – 2012-04-20 22:15:01

相關問題