pukiwiki 設定変更

※今なら Plugin/akismet.inc.php - Sonots' PukiWiki プラグイン を使うのがいいのかも
※ここの内容等を纏めた物を小江戸LUG の勉強会で発表しました.->KoedoLUG
※ここの内容等を纏めた物を小江戸LUG のLinuxUSER 2007冬号に8p 書きました.
コミックマーケット73 3日目(月)西ひ16a で頒布予定です. 新刊持ち込み分200冊完売しました.残り100冊あるそうです.恐らくまた夏のc74にて販売すると思います.

Ascii SPAM 拒否/ひらがなの含まれないメッセージの拒否

SPAM コメント対策 [#b0dbcd39] コメントスパム対策しなきゃ….

なんかそれっぽい処理入れました.
Ascii 文字のみの投稿は無視される様になったと思います.
謎の言語やロシア語等ascii 以外のspam が増えたので,平仮名の含まれ無いコメントは無視される様に変更しました.

念のためSPAM 判定されたコメントは,http://hpv.cc/~maty/pukiwiki1/SPAM.log に溜まる様にしました.誤検知を発見した場合は手動にて対応します.

  • comment.inc.php のL39 辺りに以下を追加.
    //      if (mb_detect_encoding($vars['msg']) == "ASCII" ){
            if(!preg_match('/[ぁ-ん]+/', $vars['msg'])){
                   $fp = fopen("/home/maty/public_html/pukiwiki1/SPAM.log", 'a+');
                   flock($fp, LOCK_EX);
                   fputs($fp,$vars['refer'].",".$vars['msg'].",".$vars['name'].",".date("Y-m-d:H:i:s")."\n");
                   flock($fp, LOCK_UN);
                   fclose($fp);
                   return array('msg'=>'', 'body'=>'');
           }
    フォーマットは,
    ページ名,コメント,お名前,投稿年月日時分秒

#PHP 知らないんで変な文法になっているかも…

更に別の言語のSPAM…/ひらがなが含まれていない場合拒否に

- about  http://fenzin.ru 瘉瘠蓆鱚袱 �迺瑜鱶褂 information  -- [[dr]] &new{2007-05-22 (火) 18:07:18};
- for more info click to  http://forum-volgograd.ru �頌 跏褓鉈  -- [[tr]] &new{2007-05-23 (水) 03:12:49};

これは何語だろうorz
log はこの辺

200.21.168.45 - - [23/May/2007:03:12:48 +0900] "POST /~maty/pukiwiki1/index.php HTTP/1.0" 200 21798 "http://hpv.cc/~maty/pukiwiki1/index.php?%B4%FB%C2%B8%B7%C7%BC%A8%C8%C4%B2%FE%C2%A4" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

うげ,下手すると手動かこいつ? whois に聞くとmexico でCIDR は200.0.0.0/8 広っ.

こうなると,送信時のform 側をいじるしかないかな.めんどくさいなぁ….おまけに手動だった場合効果が無いかも.ref 詐称だと良いな
参考)

とりあえず,平仮名が入ってないと弾く様にしてみました.
が,

- <a href=" http://eriqygyzam90.land.ru/ ">芻琲鉤髓矗 頌髑褂 蓁鉐鴃琿&#65533;</a>  [URL=http://eriqygyzam90.land.ru/]芻琲鉤髓矗 頌髑褂 蓁鉐鴃琿&#65533;[/URL] -- [[芻琲鉤髓矗 頌髑褂 蓁鉐鴃琿&#65533;]] &new{2007-10-30 (火) 18:21:35};

こんなのがorz
中国語?

while(<DATA>){
        chomp;
        @list=split('');
        for($i=0;$i<$#list;$i++){
                print"$list[$i]$list[$i+1]\t";
                printf"%02x%02x\n",ord($list[$i]),ord($list[$i+1]);
        }
}
__DATA__

こんなのに放り込んでみたけど見た感じ平仮名はない.むー.code 表どこだ.
あ,要らないか.上のにぁんを放り込んでみると,ぁ->a4a1/ん->a4f3 なので平仮名の範囲は,0xA4A1~0xA4F3 みたい.

                $tmp=sprintf"0x%02X%02X",ord($list[$i]),ord($list[$i+1]);
                if((oct($tmp) >= 0xA4A1 ) &&
                   (oct($tmp) <= 0xA4F3 )){
                        print"平仮名";
                }
                print"\n";

を追加してみたけど,出てきません….となると以下の処理が間違っているのかspam コメントをcopy する時にデータが壊れたかですかねぇ.

        if(!preg_match('/[ぁ-ん]+/', $vars['msg'])){

新たなspam がすり抜けてきたので,lynx -dump hoge > fuga として,spam 部分を抜き出して上のscript に掛けてみました.出てきません…. ロジックが間違っているっぽい.若しくは文字コード?

アプローチを変えてみる->参照URL から判別してみる?

参照URL から判別してみる

spam の環境変数HTTP_REFERER を参照してみると空だった. 当たり前だが,普通にcomment のform からpost するとここのURL が入ってくる. 判定部分を,

         if(!ereg("^http://hpv.cc/~maty/pukiwiki", $_SERVER["HTTP_REFERER"])){

としてみる.
これで暫く様子を見てみたい.
大体弾きますが,リンクを辿ってくるのもいますね.5件くらい書き込まれてしまった.
次はどうするかなー.

フォームに1手間

参照URL も全部ははじけないので次の手. 登校時にcheckbox のcheck を付けて,外さないと投稿が反映されない様にしてみる.
これは利用者の手間が増えるのであまりやりたくなかったのですけど….

HTTP_REFERER がここでないか,spam check が駄目だったらという感じで.source のdiff は以下の様な感じに.

% diff ~/src/pukiwiki-1.4.7_notb/plugin/comment.inc.php ~/public_html/pukiwiki1/plugin/comment.inc.php
3c3
< // $Id: comment.inc.php,v 1.36 2006/01/28 14:54:51 teanan Exp $
---
> // $Id: comment.inc.php,v 1.35 2005/05/06 04:44:20 henoheno Exp $
38a39,53
> //    if (mb_detect_encoding($vars['msg']) == "ASCII" ){
> //    if(!mb_ereg('/[ぁ-ん]+/', $vars['msg'])){
> //    if(!preg_match('/[ぁ-ん]+/', $vars['msg'])){
> //    if(!ereg("^http://hpv.cc/~maty/pukiwiki", $_SERVER["HTTP_REFERER"])){
>       if((strncmp("http://hpv.cc/~maty/pukiwiki", $_SERVER["HTTP_REFERER"], 28)) ||
>          ($vars['nospam'])){
>               $fp = fopen("/home/maty/public_html/pukiwiki1/SPAM.log", 'a+');
>               flock($fp, LOCK_EX);
>               fputs($fp,'"'.$vars['refer'].'","'.$vars['msg'].'","'.$vars['name'].'","'.date("Y-m-d:H:i:s").'","'.$_SERVER["REMOTE_ADDR"].'","'.$_SERVER["HTTP_REFERER"].'"'."\n");
>               flock($fp, LOCK_UN);
>               fclose($fp);
>               return array('msg'=>'', 'body'=>'');
>       }
>       $vars['msg']=$vars['msg']."\n//&color(#DDEEFF){<!-- debug print ".$vars['nospam']."/".$_SERVER["REMOTE_ADDR"]."/".$_SERVER["HTTP_REFERER"]."-->};\n_";
>
63c78,79
<                                       $comment . "\n"; // Insert one blank line below #commment
---
>                                       "\n" . // Insert one blank line below #commment, too (only by design)
>                                       $comment; // "\n" is already there or EOF
106c122,123
<                       '" />' . "\n";
---
>                       '" />' . "\n" .
>                       '<input type="checkbox" name="nospam" checked value="nospam">spam 避けですcheck を外して下さい';

#このplugin 古いですね.後で差し替え説きます.
さてどうかな?

しかしここまでやると文字参照のやつをやった方が簡単かも

文字参照でspam 避け

参考)

今度やります.

組み込んでみましたが,ちゃんと変換されて出てきてしまう様な….

2008.01.10)
久々にspam を食らいました. logを見ていると上のフォームに1手間の対策もすり抜けてきてます.nospam みたいなありがちな文字列でなくランダムな物とかにすると防げるのかもしれないけど,う〜ん.
でもよく見ると試しに埋め込んでいた文字参照の文字列がそのまま渡ってきてました. そこで,文字参照のロジックを有効に. その後,同様のパターンのspam を弾くのを確認しました♪

% diff comment.inc.php-org comment.inc.php
25a26,55
>       # DEBUG 用
>       $fp = fopen("/home/maty/public_html/pukiwiki1/DEBUG.log", 'a+');
>       flock($fp, LOCK_EX);
>       fputs($fp,date("Y-m-d:H:i:s")
>               .','.$_SERVER{'SERVER_PROTOCOL'}
>               .','.$_SERVER{'REQUEST_METHOD'}
>               .',/'.$_SERVER{'HTTP_ACCEPT_CHARSET'}
>               .'/,/'.$_SERVER{'HTTP_ACCEPT_LANGUAGE'}
>               .'/,'.$_SERVER{'HTTP_REFERER'}
>               .','.$_SERVER{'HTTP_USER_AGENT'}
>               .','.$_SERVER{'REMOTE_ADDR'}
>       #       .','.$_SERVER{'REMOTE_HOST'}
>       #       .'.'.$_SERVER{'REQUEST_URI'}
>       #       .','.$_GET{''}
>               .','.$_POST{'plugin'}
>               .','.$_POST{'refer'}
>               .','.$_POST{'comment_no'}
>               .','.$_POST{'nodate'}
>               .','.$_POST{'above'}
>               .','.$_POST{'digest'}
>               .','.$_POST{'_p_comment_name_0'}
>               .','.$_POST{'nospam'}
>               .','.$_POST{'nospam2'}
>               .','.$_POST{'msg'}
>               .','.$_POST{'comment'}
>               .','.$script
>               ."\n");
>       flock($fp, LOCK_UN);
>       fclose($fp);
>
38a69,79
>       if((strncmp("http://hpv.cc/~maty/pukiwiki", $_SERVER["HTTP_REFERER"], 28                                                                )) ||   // REFERER が違う場合投稿禁止
>          (!$vars['nospam']) ||  // nospam check が無い場合投稿禁止
>          (strcmp($_POST['nospam2'],'あ'))){
>               # ログを書き出して終了
>               $fp = fopen("/home/maty/public_html/pukiwiki1/SPAM.log", 'a+');
>               flock($fp, LOCK_EX);
>               fputs($fp,$vars['refer'].",".$vars['msg'].",".$vars['name'].",".                                                                date("Y-m-d:H:i:s").",".$script."\n");
>               flock($fp, LOCK_UN);
>               fclose($fp);
>               return array('msg'=>'', 'body'=>'');
>       }
106a148
>               $nametags .= '<input type="checkbox" name="nospam" value="nospam                                                                ">spam 避けですcheck を付けて下さい';
123a166
>   <INPUT TYPE="HIDDEN" NAME="nospam2" VALUE="&#12354;">

今回の新しい処理部分は,以下の判定部分と

          (strcmp($_POST['nospam2'],'あ'))){

以下のform 部品埋め込み部分です.

   <INPUT TYPE="HIDDEN" NAME="nospam2" VALUE="&#12354;">

nospam2 の&#12354; を文字参照から実際の文字,今回簿場合はへと変換できなかった場合投稿を無視します.

その他の方法

CAPTCHA

音声にちゃんと対応したものでないと視覚障害者向けにサービス提供できない.
簡単なのだと破られるし.

破ったScript はスパマーの間で売り買いもされているそう….#どこどこ用$xxx な感じで.

  • Gmail
    ピクチャ 12.png
    ちゃんと音声にも対応.
    車椅子マークで音声が流れる.バックにノイズも入ってる.
  • fc2
    ピクチャ 14.png
    音声には対応していないけど,日本語(ひらがなカタカナ)を使っているのが珍しい.
    でもなんか弱そうな感じ.
    どうせなら漢字も使ってみるとか. 常用漢字だけでも2000文字くらいあるし :-P
  • zoomeの画像認証
    http://gyazo.com/cd5efae75566f38a2e0ae43ef9277073.png
    数字のみ音声無しみたい.

猫認証/犬認証 :-)

猫画像を選択して認証を行う.サンプル数が少ないと単純なパターンマッチングで回避されてしまうのでパターンを増やしたり画像を加工するなどの工夫が必要.

  • Asirra
    ピクチャ 13.png
    これは,Microsoft Research のサービス.認証画像としてhttp://www.petfinder.com/ の画像を200万以上用意しているらしい.
    Python, PHP, C#, VB, JScript, Perl の各言語に対応している.犬認証に変更することも可能.
    視覚障害者向けにはサービスでき無さそう.#鳴き声のサンプルを….

画像なぞなぞ認証

ピクチャ 17.png
直感的でおもしろいけど,画像認証なのでちょっとという感じ.

時間差

メッセージ投稿画面が表示されてから実際に投稿されるまでの時間を確認してbot か人間かを確認.
SMTP でもそんなspam 対策がありましたね.

JavaScript?

bot は多分JavaScript? を解さないので, submit をJavaScript? で行ったり.OnLoad? でHidden 内容を書き換えたり.
しかし,JavaScript? Off だともちろん投稿に失敗する.JavaScript? 必須なサービスなら使えるか?

関連News

ゲームに見せかけてCAPTCHA 破り

Yahoo! のCAPTCHA 破り.35%成功.

Yahoo!の画像認証システムがついに“陥落”? : セキュリティ - Computerworld.jp

LiveMail? CAPTCHA 破り.3回に1回成功.

あれなCAPTCHA

3D CAPTCHA

スパム避けに使われるGoogleの「reCAPTCHA」を自動的に99%以上突破するスクリプトが登場 - GIGAZINE

でもパターン増やせば一気に難しく出来そう. てことで近いうちに対応されるのでは?

source


  • CAPTCHA(正解)だったりCAPTURE(間違い)だったりしてますね -- itochan? 2008-07-06 (日) 14:34:55
  • ご指摘ありがとうございます.修正しました. -- matoken? 2008-07-16 (水) 01:02:33

spam 避けですcheck を付けて下さい

添付ファイル: fileピクチャ 17.png 1098件 [詳細] fileピクチャ 16.png 1057件 [詳細] fileピクチャ 14.png 1110件 [詳細] fileピクチャ 13.png 1187件 [詳細] fileピクチャ 12.png 1093件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-07-16 (水) 01:02:33 (3800d)