リロード | 新規新規 編集編集 差分差分 添付添付 バックアップバックアップ | 一覧 検索 最終更新 凍結 複製 改名 | ヘルプ | 最終更新のRSS |

 
SPAM 
http://wiki.nothing.sh/3696.html

█ SPAM

Last-modified: 2017-01-11 (水) 10:58:10 / Short URL: http://wiki.nothing.sh/3696.html / add to hatena bookmark 0 users / add to livedoor clip - users

目次

関連の管理wiki

 

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

SPAM コメント対策

謎の言語やロシア語等ascii 以外のspam が増えたので,平仮名の含まれ無いコメントは無視される様に変更しました.

念のため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'=>'');
           }
    フォーマットは,
    ページ名,コメント,お名前,投稿年月日時分秒

更に別の言語の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};

これは何語だろう

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 側をいじるしかないかな。おまけに手動だった場合効果が無いかも。
参考)

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

アプローチを変えてみる->参照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 避け

参考

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="あ">

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

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

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

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

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

エラーで削除できないページ

エラーで削除できないページがあるときは、ページ一覧から該当ページの URL を取り出します。 php? の後ろの %5B%5B のような文字列、これがエンコード済みページ名です。この文字列から % を全て抜き取ったものの後ろに ".txt" を付けた名前のファイルが wiki フォルダにあるので、ftp ソフトでそのファイルを削除します。(プラグイン「filelist」http://pukiwiki.sourceforge.jp/?PukiWiki/1.4/Manual/Plugin/E-G#zfddbc2eを使うと楽に作業が出来ます。)

タイトルに�を入れると次回から編集できないwikiになる問題は、現在タイトルに�を使えなくしています。

「�タイトル」SPAMは、そのうち削除しておきます。

一時削除


(HTML conversion costs 0.017 sec.)