本日、ルールベースのブラックリストを突破するspamをはじめて受けました。その発信元を精査していたところ、そのIPがDNSBLにリストされていることが判明したため、プログラムの調査を行ったところ、DNSBLのLookup部に致命的なバグがあり、正しくDNSBLを参照できていないことが判明しました。
jp1はspamを十分に防ぐ能力がありませんので、jp1をお使いの方は至急jp2へのアップデートをお願いします。
ダウンロードはこちら [NP_Blacklis v0.98 jp2][203clicks]
NP_Blacklis v0.98 jp3をリリースしています。
† バグの経緯
オリジナルのNP_BlacklistのDNSBLのLookupルーチンにバグがあり、それをそのまま私が再利用する形で拡張したため、オリジナルのバグを引き継いでしまいました。オリジナルのバグを見破れなかった私の凡ミスです。ごめんなさい・・・・・・。
† jp1からの変更点
・settings以下に空ファイルを追加
・DNSBLのLookup部分のバグを解消
† バグの技術的説明
たとえば、172.16.111.222'というIPアドレスからアクセスがあった場合に、このアドレスがdnsbl.example.comというDNSBLに登録されているかどうかを調べる場合には、DNSで222.111.16.172.dnsbl.example.comというレコードを検索するという作業が必要になります。その結果、DNSレコードが見つかれば(多くのDNSBLは127.0.0.xという結果を返します。)そのIPアドレスはブラックリストに載っているということになり、逆に見つからなければそのアドレスはブラックリストに載っていないという判断になります。これが簡単なDNSBLの使い方です。
この一連の注目すべきなのはDNSBLを検索する際にはIPアドレス部分を逆から並べる必要があるということです。この処理をプログラムで書く場合には'.'で区切って、逆から並べなおすという作業になります。
NP_Blacklistのほとんどの動作はblacklist_lib.phpというルーチン群で処理されており、DNSBLのLookup処理もこの中に入っています。
この処理を本来は下記のようにすべきところが
オリジナルのプログラムはこのようになっていました
explode()もsplit()も最初の引数をパターンとして、後の引数の内容を分割するものなのですが、explode()のパターンは文字列として解釈されるのに対して、split()の引数は正規表現として解釈されるという違いがあります。これにより正常に処理が行われていませんでした。
完全に僕の見落としのせいですね。
ちょっと凹んでいます。。。。。。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。