如何檢查收到的請求是否從同一個服務器發送?如何檢查來自同一服務器或不同服務器的請求?
說,我在www.domain.com上有我的域名。現在我已經php處理文件,它將處理通過此域託管的表單。只有當請求從域內發送時,這個過程纔會被執行。 www.domain.com和從其他域發送的任何其他請求都將被丟棄。
如何檢查收到的請求是否從同一個服務器發送?如何檢查來自同一服務器或不同服務器的請求?
說,我在www.domain.com上有我的域名。現在我已經php處理文件,它將處理通過此域託管的表單。只有當請求從域內發送時,這個過程纔會被執行。 www.domain.com和從其他域發送的任何其他請求都將被丟棄。
基本上:你不行。
使用HTTP協議,每個請求都是獨立於其他請求的。
第一個想法是將檢查的Referer HTTP標頭,但要注意:
所以:不是一個可靠的解決方案。
一種可能,並遠遠超過了Referer的想法更好,解決方案可以是使用一個nonce:
如果這兩個值不一樣,請拒絕使用提交的數據。
注:這個想法經常被用來幫助對抗CSRF戰鬥 - 並集成在一些框架的「表」組件(Zend Framework,例如)。
這是針對此問題的完整且準確的答案。 – tplaner 2011-03-23 19:07:53
但是,當您在不同的選項卡中打開相同的網頁時,這是一個問題。由於隨機值是在每個選項卡中再次生成的,因此用戶必須堅持使用其當前選項卡。 – Jordy 2016-06-09 22:29:15
在製作API時如何實現這一點? – VishalParkash 2017-01-04 04:57:00
我知道這是一箇舊線程,但其他人可能會發現它相關。
答案是:是的,你可以。但這取決於您的Apache/nginx服務器是否設置爲使用所需的信息填充$ _SERVER變量。大多數服務器是,所以你可以使用這種方法。
您需要做的是從$ _SERVER變量中提取HTTP_REFERER並與您的域進行比較。
<?php
function requestedByTheSameDomain() {
$myDomain = $_SERVER['SCRIPT_URI'];
$requestsSource = $_SERVER['HTTP_REFERER'];
return parse_url($myDomain, PHP_URL_HOST) === parse_url($requestsSource, PHP_URL_HOST);
}
這將檢查是否有引用者,那麼就會將其與當前的域進行比較,如果不同,則是從外部引用者
if ((isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']))) {
if (strtolower(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)) != strtolower($_SERVER['HTTP_HOST'])) {
// referer not from the same domain
}
}
您的意思是檢查域的網址被請求php文件 – KoolKabin 2011-03-23 19:05:51
我會發表評論,因爲我不確定,但難道你不能只是得到請求者的IP並且看它是否與你的服務器的IP相匹配?我在我的一個asp中做類似的事情。net apps – 2011-03-23 19:11:21