2012-12-15 47 views
2

我想檢測/阻止/轉發外部訪問者的直接請求。一些腳本只能顯示在jQuery對話框中。PHP:如何檢測外部訪問者的直接請求?

我當前的代碼:

<script> 
$(".dialog").click(function() { 
    // some code for validation 
    // ... 
    $("#dialog").load(this.href).dialog(); 
}); 
</script>  

<a href="http://domain.de/path/to/form/" class="dialog">Open me in a dialog</a> 

這工作正常,但如果我打開一個新標籤/窗口此鏈接(例如,通過點擊鼠標中鍵),表單將顯示「裸」。

在這種情況下,我想給用戶轉發到refered頁面,例如:

if ($requester != $server) { 
    header ("Location: " . $_SERVER["HTTP_REFERER"]; 
} 

我怎樣才能檢測$請求者和$服務器?我不想阻止每個腳本或整個目錄!

在此先感謝!

回答

4

添加到@Dharman建議的內容 jQuery爲所有名爲HTTP_X_REQUESTED_WITH的ajax請求添加了一個頭,因此您可以在$_SERVER全局數組中簡單檢查該頭。

例子:

 
if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]) 
{ 
    // check if the request is ajax 
    if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
      $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){ 
      // ajax content loading 
    } 

    header ("Location: index.php"); 
} 

2
if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]) 
{ 
    header ("Location: index.php"); 
} 
+1

如果一個形式是通過GET請求方法發佈 – shawndreck

+0

@shawndreck這是行不通的:感謝您的通知!但這只是爲了避免用戶獲得無形式的表單。 –

+1

不客氣。那麼它應該做的工作! – shawndreck

0

是的,你可以使用$ _ SERVER [「REMOTE_ADDR」]請求發送方的IP地址檢查遠程地址。像這樣做:

if($_SERVER['REMOTE_ADDR'] == $your_Server_IP_Address) 
    echo 'From same server'; 
else 
    echo 'from different server'; 

另一種可能的思路解決方案是使用一個nonce

  • 當顯示形式,把隱藏的輸入字段在裏面,包含 隨機值

  • 同時,將該隨機值存儲到 對應於用戶的會話中。

  • 提交表單時,檢查隱藏字段的值是否與存儲在會話中的值相同 。

如果這兩個值不相同,則拒絕使用提交的數據。

注:這個想法經常被用來幫助防止CSRF戰鬥 - 和集成在一些框架(Zend框架,例如)的「表」的組成部分。

+1

用戶的瀏覽器在BOTH實例中請求表單,比較IP地址是無用的。 – nickb

+2

REMOTE_ADDR表示請求來自的地址,如果站點的用戶與服務器不在同一本地主機上,則該請求將會不同。 – shawndreck

+0

因此,當用戶的瀏覽器請求php文件時,他可以執行檢查儀式。 – Chipmunk