効果テキメンでした。0xF9F8
前回、スパム認定されたIPアドレスを含むサブネット全体を、丸ごと「完全遮断」するという強硬手段に出た訳ですが・・・、
上記は、ここ1ヶ月半ほどのスパムコメント数の推移です。
規制を掛ける前は、最大で1日8件、平均で1日4.3件のスパムコメントが付いていましたが、スパム認定されたIPを規制することで、1日平均2.6件にまで落とすことができました。
さらに、スパム認定されたIPアドレスを含むサブネット全体を規制することで、1日平均0.2件(ここ数日は0件)にまで落とすことができました。
してやったり、という感じです。
これだけ効果が大きいものとは、当初は思いも寄りませんでした。しかも、そのほとんどが中国(cn)からのアクセスなので、実効上、なんら問題はありません。
ついでに、PHPも、さらなる改善を図りました。
前回のスクリプトを書いている途中に気付いたのですが、IPアドレスを解決する際に、わざわざAPNICのWebサーバに聞きに行かなくても、自分のサーバでwhoisコマンドを実行してその結果を得れば、HTTPプロトコルによるオーバーヘッドを無くせるので、レスポンスの改善を図ることができます。
ということで、さっそく改良しました。以下、そのソース(一部)です。
「ip2cidr()」は、IPv4形式のIPアドレス(開始アドレスと終了アドレス)から、ネットアドレスとサブネットマスクを生成する関数で、PHPの電子マニュアルに載っていたもの、そのままです。
「GetNetMask()」が、今回のポイントとなる関数で、IPアドレスからネットアドレス等の関連情報を取得するものです。
「exec()」関数でwhoisコマンドを実行し、結果をバッファに入れます。バッファを検索し、「inetnum」という文字列があれば、IPv4形式のIPアドレス(開始アドレスと終了アドレス)を取得します。
あわせて、「country」という文字列があれば、国籍を取得します。
なお、IPアドレスによっては、「inetnum」がwhoisサーバのデータベースに載っていない場合があるため、その場合には、例外処理をしています。