[英]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.