如何使用PHP创建URL黑名单?

时间:2011-12-15 00:12:09

标签: php regex

我正在尝试将我脚本中的某些网址列入黑名单。我想基于主URL阻止所有子域,子文件夹(www和非www版本)等。即...

subdomain.baddomain.com
baddomain.com/subfolder/file.php
www.baddomain.com/subfolder/file.php

正则表达式最好吗?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:3)

以下应该可以解决问题:

if(in_array(parse_url($url, PHP_URL_HOST), $blacklist)) {
    //blacklisted addr
}

答案 1 :(得分:1)

Corbin的答案只会阻止明确的匹配,这意味着您必须输入要阻止的每个域/子域组合。如果您只有两个域名,例如“www.domain.com”& “domain.com”。如果你有数十,数百或数千,那将是一个真正的头痛。这个函数更加健壮,因为它检查被禁域名字符串是否在域名的任何部分,它也更慢:)。

$bannedDomains = array('banned.com') // blocks top level & subdomains.
function bannedDomain($url, $bannedDomains) {
  $domain = parse_url($url, PHP_HOST_URL);
  foreach($bannedDomains as $bannedDomain) {
     if (strpos($domain, $bannedDomain) !== false) {
      return true;
    }
  }
  return false;
}

这里也有一个警告,因为它是盲字符串匹配,因此有可能让某人像“www.banned.com.notbanned.com”这样的域名作为域名,因为禁止的域名字符串是在该域内,您最终会阻止有效的域名。域匹配&鉴于各种TLD和&那里的子域名。

此外,如果您只使用显式匹配,那么将域用作关联数组中的键更有效率。然后使用isset()来检测它们是否存在于您的禁止列表中。

$bannedDomains = array(
 'www.banned.com' => true,
 'banned.com' => true
);

function bannedDomain($url, $bannedDomains) {
 $domain = parse_url($url, PHP_HOST_URL);
 return isset($bannedDomains[$domain]);
}

如果你真的需要一个超级健壮的系统,那么最好在数据库中使用查找或使用HTTP服务器的功能。

答案 2 :(得分:0)

您不需要正则表达式,需要strpos()