タグ別アーカイブ: BBS spam

プラグインなしから発想するWordPressセキュリティ – IP Geo Blockの更新告知

昨年末、一晩で15000余りの パスワード辞書によるクラッキング を受けました。その時のログを分析してみて改めて思ったのは、「これだけランダムで長けりゃ大丈夫」的なパスワードも、「漏れたら終わり」って事です。

「ランダムで長いパスワード」をアカウント毎に頻繁に変えるのは面倒なワケで、長い間変えずに使い続けと、漏洩時のリスクが極めて高くなるってことだと思います。

おっと、何も パスワードの定期変更は必要か の議論へ乱入しようというワケじゃありません。

IPアドレスのジオロケーション情報を元に海外からの投稿を弾くスパム対策プラグイン IP Geo Block に、wp-login.phpwp-admin/admin.phpxmlrpc.php へのアクセスを遮断するセキュリティ機能、さらにはログを記録する機能を追加したので、その告知が本記事の主題です 😉 。

続きを読む

MaxMindジオロケーションDBの自動更新を装備、IP Geo Blockの更新告知

このところ海外からのスパムを弾く拙作の WordPress プラグイン IP Geo Block の機能アップにかなりの時間を割いています。

最初のバージョンで IP アドレスから国が引ける API をネット越しに叩き、次いでサーバー負荷の低減を狙って キャッシュを実装した ワケですが、ここ最近、無料 RESTful API のサービス中止が相次いだため、急ぎ安定した MaxMind無料 GeoLite データベース を使えるようにする必要があった次第です。

プログラミングは嫌いな方ではないですが、スパムやら bot 対策は何も新しいものを生みません。一所懸命に作り込んでも空しさが拭えないので、せめてココで告知させて下さい 😉 。

2014年10月13日 追記

今回のバージョンアップではオプションテーブルの更新が必要なのですが、自動更新では更新処理が働きません。対応策が見つかるまではお手数ですが、更新後に一旦
「停止」し、再度「有効化」していただくよう、お願いします m_(..)_m。

続きを読む

スパムの連続投稿によく効くキャッシュを装備したIP Geo Blockの更新告知

ここ数日間、本サイトではスパムの連投が流行っています 😡 。

こいつらに貴重なサーバー資源を食われるのは1ミリたりとも許せないワケで、かつては日本以外の IP アドレスを .htaccess に手作業で書き込んでいましたが、あまりにも量が多く、馬鹿げているので止めました。

そんなワケで作ったのが、海外からの投稿を Akismet の起動前に弾く IP Geo Block というプラグインなんですが、スパムは激減するものの、IP アドレスの検索に少々時間がかかるのが気になる点でした。

で、この度、一度検索した IP アドレスをキャッシュに保持する機構を付けたところ、思いの外、効果があったので、バージョン 1.1.0 として告知したいと思います 🙂 。

続きを読む

AkismetでPerl掲示板CGIのスパム対策を-実験編

スパムの巣窟と化した掲示板コレクション に掲載した掲示板は、このブログの最初の記事 掲示板スパムのツール投稿専用サーバーを見つけた で書いた約80万件のリストから、日本語の掲示板を一部(およそ200件以上)を抜き出し、現在もスパムに汚染され続けている掲示板(約100件あまり)をチョイスしたものです。

調査段階で特徴的だった事は、ISSOさんのスパム対策掲示板 (最近独自ドメインを取得されたようですネ)の約半数はクリーン、残り半数が汚染されていた点です。そして必ずしも新しいバージョンがスパムをブロック出来ているというわけではありませんでした。

これはあくまで推測ですが、NGワードファイル が最新かどうか、が分かれ目のように思います。コメント中に記載されたドメイン名などは所詮有限なワケで、ひたすらNGワードに登録し続けるというのも確かに有効な手段だと思います。ですが人の幸せをこころざし、対策版を一般公開したら最後、その裏を掻く投稿とのイタチごっこになってしまうのは、悲しいかな止むを得ない事です。

一方、最強の呼び声高い Akismet のメリットを挙げれば次のようになります。

  • スパム判定アルゴリズムが一般には非公開
  • たとえアルゴリズムが分かったとしても、その境界を見つけることは困難
  • たとえその境界が突破されても、ユーザーからの膨大なフィードバックで、より防衛精度が向上する

おそらく学習系のアルゴリズムを用いていると思いますが、ルール的な従来のスパム判定とアナログ的な学習系判定の概念的な違い(あくまで概念ネ 😀 )を図に表せば、次のようになるでしょう。
続きを読む

AkismetでPerl掲示板CGIのスパム対策を-準備編

I love SPAM™商標:©SPAM™ 素材:Wikimedia Commons

AkismetWordPress 専用かと思っていましたが、Protect Yourself from Parasite Spam with Akismet ≪ Weblog Tools CollectionMovable TypeDrupalPHP.NET など、20以上のアプリケーションシステムやプラットフォームでも使えることを知りました。その中には Perl 用のモジュールもあり、実際に掲示板 CGI に組み込むまでのステップを何回かに分けて解説してみたいと思います。
続きを読む

スパムの巣窟と化した掲示板コレクション

dead bbs collection
主に見放され、生きる屍と化した可哀相な掲示板たち…

今回はそんな掲示板 CGI を収集してみました。表のページからはリンクが切れていても検索エンジンにはしっかりインデックスされていて、SEO 的にマズイ例もあります。
続きを読む

スパムに効く正規表現5-Shift_JISひらがな判定と文字数カウント

掲示板 CGI で英文スパムを弾くのに、ひらがなが含まれているかをチェックすることがあるでしょう。例えば、掲示板スパム対策 – 日本語がないメッセージの書き込みを禁止する では、コメントに Shift_JIS ひらがな、カタカナが含まれているかを判定するために、次の様な Perl の正規表が紹介されています。

if ($in{'comment'} !~ /(x82[x9F-xF2])|(x83[x40-x96])/) {
	&error("日本語を書いてください。");
}

このコードは例えば b、c という文字列を見逃してしまいます。何故ならこの文字列には x82 xa4 という、ひらがなの「う」を表すコードの並びが入っているからです。

    b      、       c
x82 x82  xa4  x82 x83

この場合は次のように、2文字連続するパターンを正規表現で表現すれば誤判定の頻度はグッと減るでしょう。

if ($in{'comment'} !~ /(x82[x9F-xF2])|(x83[x40-x96]){2}/) {
	&error("日本語を書いてください。");
}

しかし敵も然る者、一部に簡単な日本語を混ぜて投稿をしてきます。こうなると日本語の文字数と英数字の文字数を数え、一定以上日本語が含まれているかどうかをチェックしたくなります。今回はそんなエントリーです。

2010年10月1日追記

ロシア人の という意味のロシア語 Русское が2回続くパターンがあることが分かりました。

    Р         у         с         с         к         о         е
x84 x51  x84 x85  x84 x83  x84 x83  x84 x7b  x84 x80  x84 x75

ロシア語には сс を含む単語が結構あるので、上記正規表現の {2}{3} に変えるか、こういう対処療法がイヤな人は次章を参照してください。
続きを読む

スパムに効く正規表現4-Shift_JIS以外の文字を削除する

かなり前のことですが、掲示板 CGI (Shift_JIS で書かれた Perl スクリプト)のスパムフィルターにかかった投稿を管理画面で開いた際、レイアウトが崩れたことがありました。UTF-8 で投稿された記事をスクリプト側が処理できず、Shift_JIS で表示をしようとしたブラウザが タグの開始記号 < を解釈出来なかったのでは?、と当時その原因を推定しました。日本語環境から普通に投稿すれば、こちらの指定した charset で返してくるのがまっとうなブラウザの動作だと思うので、かなり怪しい投稿と言えます。

さて、タグが乗っ取られないように対策することにしたのですが、当時私の使っていた @nifty は一切の Perl 用モジュールが使えず、UTF-8 を処理できない jcode.pl を使用せざるを得ませんでした(Jcode.pm を個別にアップロードするという手はありましたが…)。そこで表題のような正規表現を考えたわけです。

現在では CGI が動作するホスティングサービスであれば encode モジュールが普通に使えるので、もはやニーズのないエントリーなのかもしれませんが、G アサーションを使った正規表現の応用と考えれば、誰かの役に立つかもしれないと思いポストします。
続きを読む

スパムに効く正規表現3-文字化けしないShift JIS空白の削除

掲示板 CGI には大抵、禁止ワードを含んだ投稿をスパム扱いする機能が備わっていますが、例えば「きんし」という単語に対し、敵は「き ん し」などとスペースを入れて投稿してきたりします。当然、CGI 側は次のような正規表現と s/// 演算子を使って記事中の空白・改行(x81x40 は Shift JIS で全角スペースを表します)を削除した後、投稿禁止ワードを検索したりするわけです。

$text =~ s/s|x81x40|<br>//ig;

一方 Perl は $text の中身が Shift JIS か UTF-8 かなどはお構い無しに、単にバイトデータ列としてマッチングと置換を行いますので、上記の Perl コードでは例えば a@Ab` に変わってしまうなど、文字化けが発生してしまいます。

勿論、人目に触れることのない処理なので影響はないのですが、今回は Shift JIS の文字列を正しく区切りながらマッチングを行う正規表現について考えてみたいと思います。
続きを読む

スパムに効く正規表現2-URLの分解とドメイン名の抽出

ウチのCGI掲示板には、スパムと判定された投稿からURLのドメイン名を抽出し、投稿禁止ワードとして一定期間保持する機能を持たせています。他のスパム判定フィルタと合わせることでモレを少なくする効果を狙ったものですが、特にスパム対策が未熟だった頃、この機能に引っかかったスパム投稿も少なくありませんでした。

さて、正規表現 URL 分解 を Google で検索する と第1位に「正規表現サンプル(URLを分解する)」が挙がり、次のような正規表現が紹介されています。

^(.+?)://(.+?):?(d+)?(/.*)?$

この正規表現は、左側のカッコから順に スキームホストポートパス へと分解してくれるのですが、http://127.0.0.1/ の様にIPアドレスで構成されたURLの場合、ホストが 127.0.0.、ポートが 1 となってしまうという問題点があります。

もちろんこれを改善する正規表現を作ることは出来るのですが、ここでは RFC2396日本語訳) に従ってURIを分解する正規表現を検証してみたいと思います。
続きを読む