CafeGoju Website Top
◆ Announce ◆
◆ Counter ◆
Total : 1,944,343
本日 : 73 / 昨日 : 163
◆ Function ◆
キーワード検索

カテゴリー
全て(117)
雑談(12)
Goju関連(18)
スタッフ(8)
Web関連(8)
お出掛け(7)
グッズ(11)
独り言(15)
起立性調節障害(4)
DIY(5)
凍結破損関連(5)
(未分類)(44)
通常連続要約
(このページを含む)
表示   
◆ Log list ◆

最新の8件


2023/09/04(月)
 [Web関連]
2015/02/18(水)
 [Web関連] [独り言]
2007/02/07(水)
 [Web関連]
2007/01/30(火)
 [Web関連]
2007/01/23(火)
 [Web関連]
2007/01/20(土)
 [Web関連]
2006/03/22(水)
 [Web関連]
■ 遺言
2006/03/20(月)
 [雑談] [Web関連]
◆ Recent Comment ◆
2014/10/10(金) 15:31:39
posted by マスター
2014/10/08(水) 10:57:16
posted by じゅんじゅん
2014/09/12(金) 00:56:10
posted by マスター
2014/09/10(水) 14:52:29
posted by じゅんじゅん
2013/07/07(日) 14:05:06
posted by jp3brx

System time 0.031250

マスターの独り言

<< スパム対策(その2:追加) スパム対策(その1) >>
 スパム対策(その2)
【2007/01/23(火)】

 [Web関連]

さて、Web siteのhtmlファイルにはスパム対策を施して、メールアドレスの自動収集システム(クローラー)が容易に収集できなくしました。

しかし、GojuのWeb siteで使用している掲示板は投稿者のメールアドレスが表示できるタイプのものですから、こちらも対策しなくてはなりません。

まあ、一番てっとり早いのは、メールアドレスを表示しないようにすればよいのですが、それでは芸がないので(笑)

 

現在Gojuに設置してある掲示板はKENT WEBさんのYY-BOARDというもので、それを一部改造して使わせて頂いています。実はこのYY−BOARDはあまりにも有名な掲示板cgiの一つなもので、「yybbs」というcgiの名称を検索してスパムを書き込むということが横行しています。困ったものです。

(yybbsを別の名称に変更すればこうしたことも少なくなるのですが、途中から変更するとなるとリンクの問題など色々面倒なのでそのまま使用しています)

 

対策の方針ですが、htmlファイル同様にjava scriptを用いることにしました。ただ、htmlファイルと違い投稿者それぞれのアドレスに対処しなければなりませんから、少し工夫を凝らすことにしました。

工夫というのはメールアドレスを一旦バラバラにしてランダムに並べ替え、その順番を示したものと合わせることによりアドレスを再現して表示するものです。

例えば私のアドレスは下記のようになります。

<SCRIPT type="text/javascript">
<!--
address('tmgfe,sra-uocj.',
'2/11/13/10/9/1/8/6/0/4/7/5/12/8/3/4/2/11/13/10/14/12/11/1',
'CafeGojuマスター');
// -->
</SCRIPT>

これが変換されて下記のようになります。

上記は一例で配列は呼び出すごとにランダムに変わります。

cgi側の記述は下記のようになります。
YY-BORDのv4.5ではサブルーチンsub html_log{}内のif($mail){〜〜〜}を書き換えます。

  #-- メールアドレスのスパム対策
  if ($mail) {
   my $p_name = \$name; #-- $nameは使用するcgiに合わせてください(\をつけること)。
   my $p_mail = $mail; #-- $mailも同様(\はいらない)
   
   my (@dd, @list, %kl);
   #-- メールの@を適当な記号に変更(javascriptも記号を合わせること)
   $p_mail =~ s/\@/\,/;
   
   @dd = split(//, $p_mail);
   my @od = @dd;
   my $ch = 0;
   my $word = '';
   my $key = '';
   srand();
   
   while( @dd ){
    my $r = int(rand(@dd));
    my $s = splice(@dd, $r, 1);
    if( !exists $kl{$s} ){
     $word .= $s;
     $kl{$s} = $ch;
     $ch += 1;
    }
   }
   foreach( @od ){
    $key .= "$kl{$_}/";
   }
   $key =~ s/\/$//;
   my $e_name = $$p_name;
   $e_name =~ s/'/\\'/g;
   $$p_name = <<"__END_OF_DATA__";

<SCRIPT type="text/javascript">
<!--
address('$word','$key','$e_name');
// -->
</SCRIPT>
<NOSCRIPT>$$p_name<span style="color: #0000FF; font-weight: normal;">[\@]</span></NOSCRIPT>
__END_OF_DATA__

  
  }

 メールアドレスを分解し、@を,(カンマ)に変更してランダムに並べ替えています。アドレス中に同じ文字がある場合は重複させず、復元用の数字のみ記載しています。
(例えば'abca'を分解して'bac'としたなら、復元用の数字は'1/0/2/1'となる)

java scriptが作動しない環境の場合は投稿者の名前の後に[@]がつきます。
(<NOSCRIPT></NOSCRIPT>内)

 

これを復元させるスクリプトは下記のようになります。
YY-BORDのv4.5ではサブルーチンsub header{}内の「print "<title>$title</title></head>\n";
」の前あたりに記述します。

 print <<"__END_OF_SCRIPT__";
<SCRIPT type="text/javascript">
<!--
function address(w,k,n){
 w = w.replace(/\\,/,"@");
 var data = new Array();
 var list = new Array();
 data = w.split("");
 list = k.split("/");
 var m = list.length;
 var mail = "mailto:";
 for(i=0; i < m; i++){
  mail += data[list[i]];
 }
 document.write(n.link(mail));
}
// -->
</SCRIPT>
__END_OF_SCRIPT__

上記の例はjava scriptが作動しない場合に<NOSCRIPT></NOSCRIPT>タグを使って名前を表示しており、例えば『java scriptを有効にするとアドレスが表示されます』などと小技を効かせる事もできます。

実はこれには少々問題がありまして、本来<NOSCRIPT></NOSCRIPT>タグはブロックタグである為、<FONT></FONT>などのインライン要素内や<ADDRESS></ADDRESS>内には記述できない事になってます。

YY-BORDv4.5の場合、名前は<B></B>タグ内に記述されますので、本来は<NOSCRIPT></NOSCRIPT>タグを記述してはいけないことになります。しかし、上記の例では<NOSCRIPT></NOSCRIPT>を使わないとjava scriptが無効な環境では名前すら表示されなくなってしまいます。

 

実際の所、IEやFireFoxなどはその辺りが寛容(?)なので問題なく表示されますが、気にする向きは下記のようにすることも出来ます。

・sub html_log{}の部分

=head1
   $$p_name = <<"__END_OF_DATA__";

<SCRIPT type="text/javascript">
<!--
address('$word','$key','$e_name');
// -->
</SCRIPT>
<NOSCRIPT>$$p_name<span style="color: #0000FF; font-weight: normal;">[\@]</span></NOSCRIPT>
__END_OF_DATA__

  
  }
=cut
#-- 上記の部分を下記のように書き換え

   $$p_name = <<"__END_OF_DATA__";

<SCRIPT type="text/javascript">
<!--
address('$word','$key');
// -->
</SCRIPT>
$$p_name
<SCRIPT type="text/javascript">
<!--
address('');
// -->
</SCRIPT>

__END_OF_DATA__

・sub header{}のfunction address(w,k,n){〜}の部分

function address(w,k){ // ',n' は無くなる
 if( w == "" ){
  document.write("<\\/A>");
 }else{
  w = w.replace(/\\,/,"@");
  var data = new Array();
  var list = new Array();
  data = w.split("");
  list = k.split("/");
  var m = list.length;
  var mail = "mailto:";
  for(i=0; i < m; i++){
   mail += data[list[i]];
  }
  document.write('<A href="'+mail+'">');
 }
}

これはjava scriptが有効な場合、名前の前後に'<A href="mailto:〜">'と'</A>'を書き込むもので、java scriptが無効な場合はそのまま名前が表示されます。

 

さて、さて、これで掲示板のメールアドレス対策も済んだわけです。

では、効果の方は? というと、実はこれらの処置を2ヶ月程前に行ったのですが、それからは着実にスパムメールは減り続け、現在はおよそ20〜30通/日に収まっています(^-^)

『一度収集されたらおしまいかな?』とも思っていたのですが、考えて見ればスパム業者はメールを送りっぱなしでそのアドレスが有効かどうかは検証しないでしょうから、常に新しいアドレスを収集する必要があり、クローラーに引っ掛からなくなればその内リストから外れる、ということなのではないかと思っています。

まあ、ともあれ、効果があって良かったです。

しかーーーし、スパムと言えばメールに限らず掲示板への書き込みもあるわけで、これを一々消していたのではたまりません。

ということで、『掲示板へのスパム投稿対策』へ続く(笑)


【追加情報】

上記だけではYY-BOARDv4.5の処理は不十分と分りました(;^_^A アセアセ・・・

スパム対策(その2:追加) 』をご覧下さい<(_ _)>

最終更新日:2008/07/19(土) 00:52:09
Posted by マスター

トラックバック(0)   コメント(0)  

スパム対策(その2:追加)

スパム対策(その1)