そろそろ1ヶ月・・・

2007/10/9 火曜日 - 1:18:52 by kensuu

こんばんわ、けんすうです。

危なかった。完全に落とすところでした。
今日月曜日だったのですね。
もう歯まで磨いてしまいましたよ。マジで寝る5秒前でした。

さて、今週は、おいらのブログである
ひとり開発ブログ」の更新が少なかったのです。

これは勉強量が少なかったのか?と思われるかもしれませんが、
いやいや、逆です。
むしろ没頭する時間が多かったため、
ブログを書くのを忘れた、というほうが近いでしょう。

昔はモチベーションを保つためにブログを書いていましたが
ここ2、3日は特にそんなことをせずにプログラムをできました。
というか、かなり楽しみながらできています。
ようやく、一段目の階段を昇れたかな?という感触です。

さて、ideamiの開発ですが
主に今週はスパム対策!これにつきます。

ideamiでは1ヶ月ほど前から
英語のロボットのスパムによる
大量投稿が目立っていました。
これをなんとかしなければいけない状態でした。

まず最初にやったことは
「URLの数が3つ以上のものは問答無用でエラーを出す」です。

<?
    //URLが多すぎないかチェック
    function num_url_check($p_string,$p_num_url,$p_name){
        if(mb_substr_count($p_string, "http://") > $p_num_url){
            $this -> disp_error_message($p_name . "個以上のURLはスパム対策のため制限しております。<br />
            大変お手数ですが、複数回にわけて書き込みをしてください。");
        }
    }
?>

こんな感じですね。簡単ですね。

これで4分の1くらいはスパムをはじけているのですが
やはりこんなものはすぐに抜けてきてしまいます。

ということで、2段階目。
user-agentやIPアドレスをとって、アクセス禁止!というパターンです。

DB上にカラムを新規に作成し

<?
$in_remote_addr = $_SERVER['REMOTE_ADDR'];
$in_user_agent = $_SERVER['HTTP_USER_AGENT'];
?>

こんなものを付け加えて記録し始めました。

しかし、現在のスパムはこんなのお見通し。
当然、user-agentもIPもコロコロかえてきます。
逆引き不可とか、Proxyはすべてはじくとか
いろいろ考えたのですが、おそらくいたちごっこになると思われます。

というわけで、次にやったのが
「ひらがなが入っていないものはエラーを出す」です。

<?
    //ひらがなが入っていないとFALSEを返してみるよ
    function hiragana_check($p_string) {
        if (mb_ereg("[あ-ん]",$p_string)) {
            return TRUE;
        }else{
            return FALSE;
        }
    }
?>

正規表現で、あ〜んまで一文字も一致しなかったら
FALSEをかえしています。
これで英語のスパムははじけます。

と、たしかに強力ではあるんですが
ひらがなが入っていないとダメというのは
さすがに影響範囲がでかいです。
URLだけを書く、またはたまたま感じとカタカナだけ、
という場合もあるわけで、あまりに乱暴です。

そこで最終的にやったのが以下。

1:ひらがなが入っているかどうかチェックする
2:入っていればそのまま投稿
3:入っていなければ、投稿確認画面をだす
4:投稿確認画面で、画像に書かれている文字を書かせる

4は画像で見たほうが早いですね。

最後のは、よくログイン時に使うやつです。
これを突破できるbotもあるみたいですが、
まだまだ威力は強いみたいなので入れてみました。

いやぁ、これの導入が大変でした。

PHPで使えるCAPTCHA画像作成ライブラリまとめ:phpspot開発日誌

の記事に非常に助けられました。

というわけで、現在のところ
スパムを0件に抑えられてはいるので、
今後、状況を見ながら改善していきたいと思います。

さて、今週はsmartyによる全面改装をし、
携帯版を完成させようと思います!

WordPress database error: [Table 'rock_100.wp_comments' doesn't exist]
SELECT * FROM wp_comments WHERE comment_post_ID = '84' AND comment_approved = '1' ORDER BY comment_date

Leave a Reply

XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>