2011-02-17 58 views
4

所以,我需要檢查引用到使用php的頁面,如果它是* .example.com或* .anothersite.com,執行代碼,但如果不是,重定向到其他地方。檢查PHP引用鏈接

我該如何去檢查HTTP_REFERER是否等於那些具有通配符的值?

謝謝!

編輯:該網址將包含多個域,所以正則表達式需要匹配找到的第一個發生。

+1

請注意,除非您可以控制瀏覽器訪問此腳本,否則您不能非常多的HTTP_REFERRER。它通常是空的,例如,如果從SSL站點重定向,或者用戶設置瀏覽器安全設置以防止發送HTTP_REFERRER。 – 2011-02-17 18:29:10

+0

是的,我不需要強烈依賴它,這是一個額外的驗證。 – JakeSteam 2011-02-17 18:34:57

回答

4
$ref = $_SERVER['HTTP_REFERER']; 
if (strpos($ref, 'example.com') !== FALSE) { 
    redirect to wherever example.com people should go 
} 
if (strpos($ref, 'example.org') !== FALSE) { 
    redirect to wherever example.org people should go 
} 

當然,這僅適用於如果引用者是 「好」。例如,來自谷歌你可能有「example.org」在搜索詞的某處,在這種情況下strpos會看到它,並重定向,即使你來自谷歌。

+0

這原來是我所需要的。我過於複雜的事情。謝謝! – JakeSteam 2011-02-17 18:39:48

+5

如果允許的主機是`iana.org`而引用者是`www.iana.org.nyud.net`,該怎麼辦?**(實際域)** – seriousdev 2011-02-17 18:55:45

1

試試這個:

if (preg_match('/\.example\.(com|org)/', $_SERVER['HTTP_REFERER'])) 
{ 
    // execute your code 
} 
else 
{ 
    header("Location: http://example.com/redirectpage.htm"); 
    exit(); 
} 
1

preg_match('/(.+?)\.example\.(com|org)/',$_SERVER['HTTP_REFERER'])

這將只匹配了子域的地址,也不會繼續尋求超越subdomain.example.com.org什麼。即subdomain.example.com/some-other-stuff。你是否也需要匹配其中之一?

更正 - 這將匹配www.example.com,但不會匹配example.com

13

應該這樣做:

$allowed_host = 'example.com'; 
$host = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST); 

if(substr($host, 0 - strlen($allowed_host)) == $allowed_host) { 
    // some code 
} else { 
    // redirection 
} 
2

其他答案檢查是好的,但並不嚴格綁定到你的網站。因此,例如價值http://attacker.com/www.example.com/的引用者幾乎可以通過所有的檢查。製作此類網站併發送跨域請求非常簡單。

有一個可靠和安全的方法來檢查是否referer是真的您的域名。當然引用者可能被欺騙,但攻擊者網站的受害者會發送正確的引用者。

訣竅在於^特殊字符。這裏是神奇的正則表達式:

^https?://(([a-z0-9-]+)\.)*example\.com/ 

^ - 確保我們在一開始
https? - 協議 - HTTP或HTTPS
(([a-z0-9-]+)\.)* - 匹配的子域,也是更高的水平,如果有的話
example\.com - 比賽主域
/ - 確保路徑啓動,因此域名無法繼續