什么是动态识别PHP子域的最佳方法?

时间:2010-04-11 12:41:13

标签: php security subdomain

我已经配置了* .mydomain.com的通配符DNS,它们都正常工作。我的问题是,我应该依赖哪些客户端子域请求?

  1. $ _ SERVER [ “HTTP_HOST”]
  2. $ _ SERVER [ “SERVER_NAME”]
  3. $ _ SERVER [ “SCRIPT_URI”]
  4. 它们似乎都包含我想要的子域部分但是在阅读了Chris的这篇文章之后:http://shiflett.org/blog/2006/mar/server-name-versus-http-host,我在海上迷路了,似乎没有安全的方法可以做到这一点?

    有关安全完成此任务的任何想法吗?您更喜欢哪种方式?

    更新:对不起,我的意思是这篇文章:http://shiflett.org/blog/2006/mar/server-name-versus-http-host

5 个答案:

答案 0 :(得分:3)

HTTP_HOST直接来自HOST标头。 Apache不会以任何方式清理它。即使对于非通配符设置,配置中的第一个虚拟主机也会收到与您配置的任何vhost都不匹配的HOST标头的请求,因此您必须小心。像任何其他用户数据一样对待它。在使用之前适当过滤它。

答案 1 :(得分:1)

我建议您获取当前页面网址,然后使用正则表达式进行检查。一定要忽略链接www,www2等的事情。

答案 2 :(得分:0)

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

始终返回一个数组,如果没有子域,则可以为空。您还应该注意,这可能会将www作为数组值返回,并且无论如何都会链接到您的根域。

答案 3 :(得分:0)

你可以使用任何但最常用的HTTP_HOST。

您不必担心'安全',因为您允许子域使用通配符。您将无法阻止用户输入“威胁”子域并向您的服务器发送请求。

如果您想禁用某些子域,那么您有几个选项,但这是一个不同的问题。

答案 4 :(得分: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];