PHPでURLのホスト名(ドメイン)が有効なものかどうかをチェックする例。
file_get_contents()でignore_errorsをtrueにしてstream_context_create()してもホスト名が名前解決できなくてWarningが出てしまう問題に悩んでいる場合などにどうぞ。
$url = 'http://www.example.com/path';
$array = parse_url($url);
if ($array && $array['host']) {
$ip = getHostByName($array['host']);
$long = ip2long($ip);
if ($long === false || $ip !== long2ip($long)) {
echo '名前解決できなかった';
} else {
echo 'OK';
}
} else {
echo 'URLが正しくない';
}
DNSで名前解決できたらOKにしている。
また、ホスト名がIPアドレス(IPv4)の場合はどんなIPでも(たとえ255.255.255.255でも)OKにしている。
ip2long()で得た値をlong2ip()でIPアドレスに戻してチェックしているのは、ip2long()が「0.0.256」のような値を「0.0.1.0」などと解釈してしまうため。
参考:(IPv4) インターネットプロトコルドット表記のアドレスを、適当なアドレスを有する文字列に変換する - PHP 5.3 日本語マニュアル
ip2long() を、それ単体で IP の検証に利用するべきではありません。long2ip() と組み合わせて利用します。
<?php
// IP が有効であることを確認します。また、不完全な形式の IP を
// 以下で示すような正しい形式(ドットで 4 つに区切られている)に変換します。
$ip = long2ip(ip2long("127.0.0.1")); // "127.0.0.1"
$ip = long2ip(ip2long("10.0.0")); // "10.0.0.0"
$ip = long2ip(ip2long("10.0.256")); // "10.0.1.0"
?>
これはIPv4を使ってるけど、今後IPv6が普及したら...その時までにPHPも進化しているでしょう。
参考
0 件のコメント:
コメントを投稿