【问题标题】:PHP - allow domains, not subdomainsPHP - 允许域,而不是子域
【发布时间】:2011-11-15 00:08:08
【问题描述】:

如果能就此事提供任何帮助,我将不胜感激。

我正在创建一个注册表单,其中一个字段用于用户域,我将验证它对 FILTER_VALIDATE_URL 有效,并且它与 dns_check_record 存在。

但是我遇到的一个问题是,使用这两种方法还会允许将子域提交到我不想要的表单。

有谁知道允许域但不允许子域的方法?

我测试了以下函数,来自http://syntax.cwarn23.net/PHP/Strip_URL_to_Domain

function domain($domainb)
{
$bits = explode('/', $domainb);
if ($bits[0]=='http:' || $bits[0]=='https:')
    {
    $domainb= $bits[2];
    } else {
    $domainb= $bits[0];
    }
unset($bits);
$bits = explode('.', $domainb);
$idz=count($bits);
$idz-=3;
if (strlen($bits[($idz+2)])==2) {
$url=$bits[$idz].'.'.$bits[($idz+1)].'.'.$bits[($idz+2)];
} else if (strlen($bits[($idz+2)])==0) {
$url=$bits[($idz)].'.'.$bits[($idz+1)];
} else {
$url=$bits[($idz+1)].'.'.$bits[($idz+2)];
}
return $url;

但这并不完美,因为任何域(例如 www.domain.uk.com)都会显示为 uk.com(我不知道常见的域扩展名)。

有没有人知道比上述函数更好的方法?

【问题讨论】:

  • 您必须明确检查 .co.uk.com.br 等内容。
  • 您对子域这个词的使用非常松散。你想拒绝像john@customers.example.com这样的地址吗?
  • 对不起,是的,我的意思是也想阻止类似的东西。

标签: php validation dns


【解决方案1】:

首先您可以使用parse_url() 仅获取主机名:http://www.stackoverflow.com -> $url['host'] = 'www.stackoverflow.com'

其次,您可以计算主机名中的点数:explode() --> count() 或substr_count()

如果主机超过 1 个点,则可能存在子域。

现在您可以使用 GolezTrol 或 arnaud576875 提到的解决方案。

【讨论】:

  • 感谢您的帮助,这是获取主机名的比我使用的更好的方法,我会记下该功能。
  • 但是如果它只包含一个点,你仍然可能有一个无效的 url。如果只是输入co.uk,请注意不要将其作为有效域。所以实际上,不管有多少个点,你总是需要检查它是否是一个有效的域。
【解决方案2】:

将它们组合起来。

dns_check_record 将在 '.co.uk' 上失败,因此您可以在点上拆分字符串,检查合并最后两部分时获得的域,如果失败,也使用第三部分,如果有的话。

您将对无效域进行双重检查,但我认为这不会成为问题。

【讨论】:

  • 非常感谢,我不知道 .co.uk 会失败。
【解决方案3】:

正如 Micheal Mior 所指出的,您必须检查 .co.uk.com.br 和许多其他网站。

一些浏览器供应商正在维护一个有效 TLD 的非 TLD 列表:http://publicsuffix.org/。名单是quite huge

有一个库here 使用这个有效的TLD 列表来实现您正在寻找的功能(下载是here)。 (通过https://wiki.mozilla.org/Gecko:Effective_TLD_Service找到。)

【讨论】:

  • ...巨大且不断变化。恕我直言,这看起来像是在浪费时间。
  • 是的,看起来列表很大,看起来我只需要手动批准每个域。不过谢谢你的帮助。
猜你喜欢
  • 2014-08-03
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 2023-03-27
  • 2016-09-18
  • 1970-01-01
相关资源
最近更新 更多