2014-09-28 62 views
0

請告訴我,如果我得到一個變量$var返回:http://foo.com - 那麼我該如何檢查這個uri是否與$referrer返回的值相同(假設有一個),或者如果$referrer = http://foo.com/oof/或更長,我該如何檢查它的第一部分。如何將變量與HTTP_REFERER的第一部分進行比較?

隨着(沒有更好的辦法?):

$referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; 

基本上我想有一個的if/else情況下,當URI匹配的,當它沒有。 我也想知道如何使它黑客安全,如果你願意,以便它不能被欺騙,當$referrer是這樣的:http://badsite.com/file.php?param1=http://foo.com,並在這裏http://foo.com部分將不被視爲合法的匹配。

非常感謝!

回答

1

只檢查域:

$yoursite = ""; //Your site url without http:// or www. 
$yoursite2 = ""; //Type your domain with www. this time 

$referer = $_SERVER['HTTP_REFERER']; 
$domain = parse_url($referer); 

if($domain['host'] == $yoursite || $domain['host'] == $yoursite2) { 
    //Run your code here normally 
} 
+0

謝謝!請告訴我,'host'部分是否意味着'$ domain'中只有'http:// .... com'的初始實例會被檢查匹配,因此不會被作弊像我在原始問題中提到的那樣? – Alex 2014-09-28 10:04:05

+0

你不能100%確定引用者,因爲有人可以中斷http請求並修改引用者,而你不知道。 – Abkarino 2014-09-28 15:50:24

+0

也許你應該開始一個會話並在其中存儲推薦人。這是用戶無法訪問或知道內容的唯一變量。 – Abkarino 2014-09-28 15:51:29

1

毫不誇張地說:

if(substr($referrer, 0, strlen($var)) == $var) 

「如果同一長度作爲搜索項的指引開始的子串,等於搜索詞......」

在某些情況下, ,推薦人可能不會以您可能期望的小寫字母發送。要允許這種情況下,考慮嘗試:

if(strcasecmp(substr($referrer, 0, strlen($var)), $var) == 0) 

這對所引用與搜索項的開始區分大小寫的比較。

+0

謝謝!但請告訴我 - 這是否只檢查長度而不檢查字符串本身的內容?無論如何,我希望它匹配'$ var'內容到'$ referrer'的正確部分,即使後者更長,但是對於僞造的uri過濾... – Alex 2014-09-28 10:13:25

+0

請閱讀並理解代碼。這是你學習的方式。 – 2014-09-28 10:17:00

+0

我已經閱讀過,我想我所要求的是合理的澄清,因爲你只提到字符串長度。請在這方面給我一個答案,或者簡而言之,請告訴我,您提供的代碼是否可以解決我問題中提到的所有問題。我真的很感激。謝謝。 – Alex 2014-09-28 10:27:15

相關問題