[英]How can I create a URL blacklist with PHP?
我正在嘗試將腳本中的某些URL列入黑名單。 我想基於主URL阻止所有子域,子文件夾(www和非www版本)等。 即..
subdomain.baddomain.com
baddomain.com/subfolder/file.php
www.baddomain.com/subfolder/file.php
正則表達式是最好的嗎? 如果是這樣,怎么辦?
以下應該可以解決問題:
if(in_array(parse_url($url, PHP_URL_HOST), $blacklist)) {
//blacklisted addr
}
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服務器的功能。
您不需要正則表達式,需要strpos()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.