2010-04-11 90 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头的请求,该头与任何已配置的虚拟主机都不匹配,因此您必须小心。像处理其他用户数据一样对待它。在使用之前进行适当的过滤。

相关问题