2010-04-11 91 views
1

我配置了* .mydomain.com的通配符DNS,並且它都正常工作。我的問題是我應該依靠哪些來識別客戶端子域請求?通過PHP動態識別子域名的最佳方式是什麼?

  1. $ _ SERVER [ 「HTTP_HOST」]
  2. $ _ SERVER [ 「SERVER_NAME」]
  3. $ _ SERVER [ 「SCRIPT_URI」]

他們似乎都包含子域部分,我想,但在閱讀克里斯的這篇文章之後:http://shiflett.org/blog/2006/mar/server-name-versus-http-host,我迷失在海上,似乎沒有安全的方法來做到這一點?

任何想法安全地完成此任務?你更喜歡哪種方法?

更新:對不起,我的意思是這個帖子:http://shiflett.org/blog/2006/mar/server-name-versus-http-host

回答

0

您可以使用任何但最多使用HTTP_HOST。

由於您爲子域名允許通配符,因此您不必擔心「安全性」。您將無法阻止用戶輸入「威脅性」子域並向您的服務器發送請求。

如果你想禁止某些子域名,那麼你有幾個選項,但那是一個不同的問題。

+0

有趣的邏輯。 「不要擔心,因爲你無法阻止攻擊」。如果他可以? – 2010-04-11 14:23:18

+0

我是否缺少某種形式的利用URL的子域名部分的攻擊,即使代碼只是'識別'子域名? – zaf 2010-04-11 14:48:19

+0

@Col。彈片:你無法阻止攻擊。你只能防止這些攻擊成功。 – Gumbo 2010-04-11 15:11:03

1

我建議你當前網頁的網址,然後使用正則表達式來檢查。一定要忽略的東西聯繫起來WWW,WWW2等

0
$subdomain = explode('.', $_SERVER['HTTP_HOST'], -2); 

返回一個數組一如既往,如果沒有子域可以是空的。您還應該確保注意,這可能會返回www作爲數組值,並且無論如何將鏈接到您的根域。

0

太多談論這樣一個小問題。
大家都說它的危險,但沒有人刻意去寫一個解決方案,就這麼簡單

$mydomain='example.com'; 
$subdomain=""; 
$matches=array(); 

$pat='!([a-z0-9_]+)\.'.preg_quote($mydomain).'$!i'; 
if (preg_match($pat,$_SERVER['HTTP_HOST'],$matches)) $subdomain=$matches[1]; 
3

HTTP_HOST直接從主機頭說到。 Apache不會以任何方式清理它。即使對於非通配符設置,配置中的第一個虛擬主機也將收到一個HOST頭的請求,該頭與任何已配置的虛擬主機都不匹配,因此您必須小心。像處理其他用戶數據一樣對待它。在使用之前進行適當的過濾。

相關問題