簡體   English   中英

PHP:如何檢測外部訪問者的直接請求?

[英]PHP: How to detect direct requests of external visitors?

我想檢測/阻止/轉發外部訪問者的直接請求。 某些腳本應該只顯示在 jQuery 對話框中。

我目前的代碼:

<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>

這工作正常,但如果我在新選項卡/窗口中打開此鏈接(例如,通過單擊鼠標中鍵),表單將顯示為“裸”。

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

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

如何檢測 $requester 和 $server? 我不想阻止每個腳本或整個目錄!

提前致謝!

要添加@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");
}
if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])
{
    header ("Location: index.php");
}

我根據外部請求輸入了這些值:

[HTTP_HOST] => 104.219.42.237

[HTTP_REFERER] => http://someurl.com

所以,我的解決方案是:

if (strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) !== FALSE) {

    echo 'same origin/request';

} else {

   echo 'different origin/request';
}

...

...

...

以前的解決方案不起作用的原因!

就我而言: $_SERVER['HTTP_REFERER'] == 'http://someurl.com'

而 $_SERVER["HTTP_HOST"] 不包含 'http' 也不包含 'https'

所以,

if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])

不匹配

另一個答案

if( $_SERVER['REMOTE_ADDR'] == $your_Server_IP_Address)

不適用於本地主機

是的,您可以使用 $_SERVER['REMOTE_ADDR'] 檢查請求發送方 IP 地址的遠程地址。 像這樣做:

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

另一個可能的想法解決方案可能是使用nonce

  • 顯示表單時,在其中放置一個隱藏的輸入字段,其中包含一個隨機值

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

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

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

注意:這個想法經常被用來幫助對抗 CSRF——並集成在一些框架(例如 Zend 框架)的“表單”組件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM