こんばんは。昨日に引き続き。
ppBlogでは、現状、ログイン試行をチェックする機構は特に採り入れていません。特に、これまで不正ログインを食らったという報告もないようですし。しかしながら、やはり、不正ログインを試みようとする情報は、把握してても良いかなとは思いますので、そういう機能を付けてみました。目指したのは、
- 3回続けてログインに失敗すると、管理者にメールで知らせる。
- 6回、同じIPアドレスからログイン試行があって、いずれも失敗すると、そのIPアドレスがアクセス拒否リストに追加される。管理者にもその旨、通知する。
です。基本的には、admin.phpをいじるだけなのですが、IPアドレス毎にアクセス拒否を行う動作を検証中に、現行バージョンではこの機能が動いていないことを見つけました。この影響で、admin.phpに加えて、utils.phpも若干の修正があります。
admin.phpに関しては、331行目からの部分に以下の追記をしました。
$loginf = OD."login.txt"; // このファイル(ownerディレクトリの中)にログイン失敗情報を記録する $ltime = time(); $ldate = date('Y-m-d@H:i:s', $ltime); if(is_file($loginf)){ $loginfo = file($loginf); $lsize = count($loginfo); $ips = preg_grep("{.+$ip}", $loginfo); $ips = count($ips); if($ips > 5){ $ban_ini_file = OD.'ban.ini.php'; include($ban_ini_file); $hit = FALSE; foreach ($BAN_LIST as $i => $item){ if(strpos($item, "$ip|0") || strpos($item, "$ip|1")){ $BAN_LIST[$i] = "$ltime|$ip|1"; // アクセス拒否対象とする $hit = TRUE; break; } } if(!$hit) array_push($BAN_LIST, "$ltime|$ip|1"); // アクセス拒否IPリストに追加 rewrite_ini($ban_ini_file, $BAN_LIST); if(trim(MAILTO) != ''){ include_once('modules/mail.inc.php'); $msg = 'ログイン試行が頻発しているようで、とりあえずブロックしました。IPアドレスは '.$ip.NL; $msg .= 'アクセス自体を拒否してます。解除するには、管理画面→「IPコントロール」→「コメント・TB拒否」から。'; @send_jp_mail('ppBlog::連続ログイン試行', $msg, '', MAILTO); } exit("ログイン試行過多でブロックされました。"); } if($lsize > 1){ list($time1,,$ip1) = explode("¥t", trim($loginfo[$lsize - 1])); list($time2,,$ip2) = explode("¥t", trim($loginfo[$lsize - 2])); if(($ip1 == $ip2 && $ip1 == $ip) && $ltime - $time1 < 30){ if(trim(MAILTO) != ''){ include_once('modules/mail.inc.php'); @send_jp_mail('ppBlog::連続ログイン試行', '3回ログインに失敗したかログイン試行が頻発しているようです。IPアドレスは '.$ip.NL, '', MAILTO); } $loginfo[] = $ltime."¥t$ldate¥t$ip".NL; rewrite($loginf, array_unique($loginfo)); exit("ログイン試行が頻発しているので管理者に知らせました。"); } } $loginfo = array_slice($loginfo, 0, 29); // とりあえず30件ほどに $loginfo[] = $ltime."¥t$ldate¥t$ip".NL; rewrite($loginf, array_unique($loginfo)); } else rewrite($loginf, $ltime."¥t$ldate¥t$ip".NL);
ソースにあるように、ログインに失敗した時点で、ownerディレクトリにlogin.txtファイルが自動的に作成されます。最大30件を記録するようにしていますが、分かる方は適宜変えてもよいでしょう。
ログインに失敗したIPアドレスは記録するようにしています。統べて6回ログインに失敗すると、とりあえずそのIPアドレスをアクセス拒否リストに追加します(404 Not Foundを返す)。これは、管理画面の「IPコントロール」から、その解除が可能です。もし、勘違いか何かで、管理者自身がアクセス拒否を食らう可能性もありますが、この際は、ブラウザから管理画面には入れないので、FTPソフトを使って、ownerディレクトリにあるban.ini.phpをダウンロード、自身のIPアドレスが含まれる行を削除して、再度アップすればOKです。
普段、不正ログインを試みる対象なんて気にもしませんが、こういう機能が付いていても良いかなと思いました。この機能を実装するには、添付のutils.phpとadmin.phpを既存のやつと入れ替えるだけで良いです。
1. thida — 2008/12/05@00:05:45
この機能はすごく助かります
セキュリティの基本はもちろん自己のIDやパスワードの管理に尽きるのですが、ブログの内容によっては不正アクセスをされないとも限りませんからね
実際に危うく被害に遭いそうだった私としては本当にありがたい機能です。
感謝!