06 September 2008

(PHP) whoisデータベース

Webアプリを納品して、ログファイルにアクセス元のIPアドレスとホスト名が書かれているので、定期的に見てくださいね。 ということにしておいたところ、IPアドレス見て何が分かるかと聞かれたりすることがある。

まあ、素人ならそうだろね。 月間数万円払って、ログ解析サービスを購入するのが本来は正しいのだろうけど、一応素人ユーザにもIPアドレス何じゃらほいという情報が分かるのを作ってみた。


<html>
<body>

<?php

mb_language('Japanese');
mb_internal_encoding('Shift_JIS');
mb_http_output('Shift_JIS');

$strFilenameThis = 'whois.php';

print("<p>whoisデータベース参照サービス</p>\n");

print("<form method=\"post\" action=\"./".$strFilenameThis."\" name=\"form1\">\n");
print("\t<p>IPアドレス (IP Address) 例:66.249.89.100    <input type=\"text\" name=\"ip_addr\" size=\"30\" maxlength=\"15\" />  \n");
print("\t<input type=\"submit\" value=\"Lookup\" /></p>\n");
print("\t<p>Select database : \n<input type=\"radio\" name=\"db\" value=\"default\" checked=\"checked\" />Default \n");
print("\t<input type=\"radio\" name=\"db\" value=\"ARIN\" />ARIN \n");
print("\t<input type=\"radio\" name=\"db\" value=\"APNIC\" />APNIC \n");
print("\t<input type=\"radio\" name=\"db\" value=\"JPNIC\" />JPNIC \n");
print("\t<input type=\"radio\" name=\"db\" value=\"RIPE\" />RIPE \n");
print("\t<input type=\"radio\" name=\"db\" value=\"AFRI\" />AfriNIC \n");
print("\t<input type=\"radio\" name=\"db\" value=\"DOD\" />US-DOD \n");
print("\t<input type=\"radio\" name=\"db\" value=\"GOV\" />US-GOV \n");
print("\t<input type=\"radio\" name=\"db\" value=\"NET\" />US-NET \n");
print("\t<input type=\"radio\" name=\"db\" value=\"nslookup\" />(nslookup) </p>\n");
print("</form>\n");

if($_POST['ip_addr'])
{ // IPアドレスが指定された場合

if(!validate_numandperiod($_POST['ip_addr']) || strlen($_POST['ip_addr'])>15 || strlen($_POST['ip_addr'])<8)
{
print("<p>入力されたアドレスは、IPアドレスで無いようです。<br />IPアドレスの形式は、123.456.012.345 のように数値とピリオドで構成されます</p>\n</body>\n</html>\n");
die;
}

$strIpAddr = $_POST['ip_addr'];
if($_POST['db'] == 'ARIN'){ $strIpAddr = '-a '.$strIpAddr; }
if($_POST['db'] == 'APNIC'){ $strIpAddr = '-A '.$strIpAddr; }
if($_POST['db'] == 'RIPE'){ $strIpAddr = '-r '.$strIpAddr; }
if($_POST['db'] == 'JPNIC'){ $strIpAddr = '-h whois.nic.ad.jp '.$strIpAddr; }
if($_POST['db'] == 'AFRI'){ $strIpAddr = '-f '.$strIpAddr; }
if($_POST['db'] == 'DOD'){ $strIpAddr = '-d '.$strIpAddr; }
if($_POST['db'] == 'GOV'){ $strIpAddr = '-g '.$strIpAddr; }
if($_POST['db'] == 'NET'){ $strIpAddr = '-i '.$strIpAddr; }
print("<p>調査するIPアドレス (IP Address Looked up) : ".$strIpAddr."</p>\n");

if($_POST['db'] == 'nslookup')
{
$aryResult = array();
$nRet = NULL;
exec('nslookup '.escapeshellcmd($strIpAddr), $aryResult, $nRet);
print("<pre>\n");
for($i=0; $i<count($aryResult); $i++)
{
print(mb_convert_encoding($aryResult[$i], 'SJIS', 'auto')."\n");
}
print("</pre>\n");
}
else
{
$aryResult = array();
$nRet = NULL;
exec('whois '.escapeshellcmd($strIpAddr), $aryResult, $nRet);
print("<pre>\n");
for($i=0; $i<count($aryResult); $i++)
{
print(mb_convert_encoding($aryResult[$i], 'SJIS', 'auto')."\n");
}
print("</pre>\n");
}
}

// Posix拡張の正規表現でスキャン(ereg)するバージョン
function validate_numandperiod($sStr)
{
if(ereg('/[^0-9\.]/', $sStr))
{
// 数値とピリオド以外の文字が発見された場合
return false;
}
return true;
}

?>

</body>
</html>

mb_convert_string を利用しているのは、JPNICがISO-2022-JP (JIS)を返すから、それをShift-JISに変換するため。