所以,我需要檢查引用到使用php的頁面,如果它是* .example.com或* .anothersite.com,執行代碼,但如果不是,重定向到其他地方。檢查PHP引用鏈接
我該如何去檢查HTTP_REFERER是否等於那些具有通配符的值?
謝謝!
編輯:該網址將包含多個域,所以正則表達式需要匹配找到的第一個發生。
所以,我需要檢查引用到使用php的頁面,如果它是* .example.com或* .anothersite.com,執行代碼,但如果不是,重定向到其他地方。檢查PHP引用鏈接
我該如何去檢查HTTP_REFERER是否等於那些具有通配符的值?
謝謝!
編輯:該網址將包含多個域,所以正則表達式需要匹配找到的第一個發生。
$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會看到它,並重定向,即使你來自谷歌。
這原來是我所需要的。我過於複雜的事情。謝謝! – JakeSteam 2011-02-17 18:39:48
如果允許的主機是`iana.org`而引用者是`www.iana.org.nyud.net`,該怎麼辦?**(實際域)** – seriousdev 2011-02-17 18:55:45
試試這個:
if (preg_match('/\.example\.(com|org)/', $_SERVER['HTTP_REFERER']))
{
// execute your code
}
else
{
header("Location: http://example.com/redirectpage.htm");
exit();
}
preg_match('/(.+?)\.example\.(com|org)/',$_SERVER['HTTP_REFERER'])
這將只匹配了子域的地址,也不會繼續尋求超越subdomain.example.com
或.org
什麼。即subdomain.example.com/some-other-stuff
。你是否也需要匹配其中之一?
更正 - 這將匹配www.example.com
,但不會匹配example.com
。
應該這樣做:
$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
}
其他答案檢查是好的,但並不嚴格綁定到你的網站。因此,例如價值http://attacker.com/www.example.com/
的引用者幾乎可以通過所有的檢查。製作此類網站併發送跨域請求非常簡單。
有一個可靠和安全的方法來檢查是否referer是真的您的域名。當然引用者可能被欺騙,但攻擊者網站的受害者會發送正確的引用者。
訣竅在於^
特殊字符。這裏是神奇的正則表達式:
^https?://(([a-z0-9-]+)\.)*example\.com/
^
- 確保我們在一開始
https?
- 協議 - HTTP或HTTPS
(([a-z0-9-]+)\.)*
- 匹配的子域,也是更高的水平,如果有的話
example\.com
- 比賽主域
/
- 確保路徑啓動,因此域名無法繼續
請注意,除非您可以控制瀏覽器訪問此腳本,否則您不能非常多的HTTP_REFERRER。它通常是空的,例如,如果從SSL站點重定向,或者用戶設置瀏覽器安全設置以防止發送HTTP_REFERRER。 – 2011-02-17 18:29:10
是的,我不需要強烈依賴它,這是一個額外的驗證。 – JakeSteam 2011-02-17 18:34:57