2011-12-15 5 views
0

スクリプト内の特定のURLをブラックリストに登録しようとしています。メインURLに基​​づいて、すべてのサブドメイン、サブフォルダ(wwwおよび非wwwバージョン)などをブロックします。すなわち...PHPでURLブラックリストを作成するにはどうすればよいですか?

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

正規表現は最適でしょうか?もしそうなら、どうですか?

+0

どのようにブロックしていますか?これは '.htaccess'を使っているのですか?それはPHPでやっていますか、それとも違う、奇妙な解決策ですか? – Bojangles

+1

これはApacheサーバーですか?おそらく.htaccess経由で簡単に行うことができます –

+0

スクリプトはブックマークサービスのようなものです。特定のドメインがブックマークされないようにしたい.htaccessはここで動作しません –

答えて

2

次は、トリックを行う必要があります。

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

ありがとう!それはそのトリックを行うように見えます。 –

0

正規表現は必要ありません。strpos()が必要です。

+0

それはうまくいかないでしょう、otherdomain.com/foo/baddomain.com/barはどうですか? – ChrisM

+0

@ChrisMこれはあまりにも悪いと思いますが、通常のURLを使用しますが、あなたが主張している場合は、比較にスキーム(http://)を含めることができます。 – CodeCaster

1

をコービンの答えが唯一のブロック明示的なは、あなたが入力する必要がありますブロックするすべてのドメイン/サブドメインの組み合わせを意味すると一致します。これは、 "www.domain.com" & "domain.com"のような2つのドメインしかない場合には問題ありません。数十、数百、または数千があれば、それは本当の頭痛になるでしょう。この機能は、禁止されたドメイン文字列がドメイン名のどの部分にあるかをチェックするので、少し頑強です。それはあなたが誰かが「www.banned.com.notbanned.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; 
} 

の注意点は、ここにもあります禁止ドメイン文字列がそのドメイン内にある場合、有効なドメイン名をブロックすることになります。ドメイン照合&のバリデーションは実際にはかなり難しいですが、そこにあるサブドメイン&のさまざまな種類があるからです。

明示的に一致するだけの場合は、ドメインを連想配列&のキーとして使用し、禁止リストに存在するかどうかを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サーバーの機能を使用する方がよいでしょう。

+1

私は、私の例では完全な列挙が必要だが、忘れていると言及した。ただし、URLを解析して、禁止されているドメインが完全な文字列であるか、期間の後の最後の部分であるかどうかを確認することができます。また、assoc配列の良い提案。私は小さなセットのラインに沿って考えていました。 (しかし、もし彼がそれらの上でループすると、いずれも線形操作になります) – Corbin

関連する問題