#navi(../)
*Nextシリーズ技術仕様書
YY-BOARD NEXT、プチ☆ボード ねくすと、YY-Thread、iNote、Joyful Note Next関連で使用されている機能についての技術的な解説をここで行います。

*アイコン自動登録機能

*荒らし対策関連
Nextシリーズの大きな特徴の一つである、荒らし対策関連の機能についての解説です。
**プロクシキックについて
プロクシサーバーの本来の目的は、回線状況などの理由でアクセスに時間がかかるサイトを、いったん別のサーバーに保存(キャッシュ)して、そこから代行してそのサイトを閲覧するためのものですが、一般的には、そのキャッシュするという基本的な性質を悪用し、プロクシサーバーに投稿処理も代行させるため、攻撃者は何のリスクもなしに掲示板へ投稿できることになります。

基本的なプロクシキックのロジックは[[Curl牧師作成のForce264>http://web.archive.org/web/*/www.tok2.com/home/pat/]]をベースに作られています。具体的なロジックは、環境変数よりビジターのホストが、直接アクセスであるか、プロクシ経由のアクセスであるかを判定します。デフォルトでは、投稿者のIP情報を保持しているプロクシサーバー(俗に漏れ串と呼ばれる)以外のサーバーからの投稿を禁じています。

ただし、これはブロードバンド化以前の荒らし対策方法であって、現在においてはやや時代遅れなものとなっています。闇雲に設定を厳しくするとぷららや、大学や専門学校といった教育機関からのアクセスが不可能になるだけなので、そのことに留意して使用してください。

**セッション処理
現在の荒らしの特徴として、掲示板の投稿フォームを自動的に埋めて投稿という形式ではなく、直接スクリプトに投稿された状態と同じ命令を送信しています。(POSTコマンドを直接掲示板に打ち込んでいる)ブロードバンド化が進んだ現在、プロクシを使わなくとも攻撃者の身元を明らかにすることは困難であり、また、プロバイダ側も個別のケースに対処することは事実上無理なため、攻撃者はプロクシを通す必要性がありません。

そこで、私は、セッション処理をもうけることにしました。これはスクリプト側で一定時間有効なハッシュを生成し、そのハッシュが有効でない場合、投稿できなくなるものです。PHPスクリプトで構築されたサイトを閲覧する際に?PHPSID=c2a8f0145851e2520cef31d91aad6a48というようなものをみたことがあるとおもいますが、これがセッション処理です。

現在、Nextシリーズでは、任意の文字と有効時間を暗号化するだけの簡単な処理しか行っていませんが、そのハッシュを外部スクリプトから生成することは、比較的困難であり、同一IP連続投稿制限と併用することで、簡単なBotによる自動投稿荒らしを防ぐことは可能です。

欠点として、一定期間を過ぎた投稿は、時間オーバーとなり投稿できなくなります。具体的には、iModeなどといった投稿に時間がかかる、携帯端末からの投稿に、問題が生じる可能性があります。

セッションの発行
#code(perl){{
sub GetSession {
	# セッションモジュール
	use CGI::Session;
	$session = new CGI::Session(undef,undef,{Directory=>'./session.tmp'});
	$session->expire('+1m'); #有効期限は1分間
	$session->param('name',$next); #セッション経由で引き渡す項目と値
	$sid = $session->id;
	$sname = $session->param('name');
}
}}

セッションのチェック
#code(perl){{
	if(defined $sid && $sid eq $session->id){
		$FLAG{'sid'} = 1;
	}elsif (defined $sid && $sid ne $session->id){
		$FLAG{'sid'} = 0;
	}else{
		$FLAG{'sid'} = 0;
		# $session->delete();
	}
}}

**オープンプロクシ処理
近年のスパムをみていると、blogの流行により、セキュリティ意識の低いサイトにスパムの絨毯攻撃をしかけるだけで、簡単に目的のスパムをすることが可能となっています。また、プロクシキックの項で解説した漏れ串でないプロクシサーバーを使わなくとも、ウィルス、バックドアなどでゾンビ化したPCを踏み台にしたり、[[Tor>http://tor.eff.org/]]のようなP2P型自動匿名プロクシ接続ツールを用いることによって、同一者が複数のIPからの投稿ができたり、場合によってはDoS攻撃を一人で実行できるようになっています。

この場合、いくらアクセス禁止と指定しても、簡単に別のサーバーから投稿することが可能であり、また、上記で述べたゾンビPCやP2Pで接続されたPCからの場合、そのその踏み台となったPC自体がプロクシサーバーとして機能するため、これまでの対処方法では防げないことになります。

とりあえずの対策として、[[ガードプロクシ>http://hp.vector.co.jp/authors/VA039555/]]というフリーウェアを用いて、オープンプロクシサーバーの情報を自動更新し.htaccessでアクセス制限をすることを推奨してきましたが、当然莫大な量のアクセス制限するため、その分サーバのオーバーヘッドが生じてしまう可能性がありました。また、サーバによっては.htaccessが設置できないこともあり、疑問符が残る結果となりました。

そこで、現在私は公共のブラックリストを使うことにしました。ゾンビPCやP2Pプロクシからの投稿を完全に防ぎきることはできませんが、ブラックリスト認定されているオープンプロクシからの投稿は防ぐことが可能になります。

この機能は、与えられたホスト名を、オープンプロクシのデーターベースのあるサーバに、送信するとそれがプロクシだった場合、127.0.0.2という値を戻してきます。下の例は、2ちゃんねるの[[BBQ荒らしお断りシステム>http://info.2ch.net/wiki/pukiwiki.php?BBQ]]に問い合わせる場合のソースコード(のコピペ)です。
#code(perl){{
sub checkProxyList
{
	my $RADDR = $ENV{'REMOTE_ADDR'};

	$RADDR =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
	my $query_addr = "$4.$3.$2.$1.niku.2ch.net";
	my $addr = join('.', unpack('C*', gethostbyname($query_addr)));
	if ($addr eq '127.0.0.2')
	{
		DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)");
	}
	return 0	;
}
}}

ただ、外部とのサーバーのやりとりをするため、接続状態によるタイムアウトの可能性もあるため、今後はキャッシュ処理を行う必要がありそうです。
**リンク処理
最近のスパムの内容には、URLの羅列のみを投稿するパターンが多いです。これは、単に人を呼び寄せるという目的ではなく、サーチエンジンで上位に表示されるようにするために行われます。現在のロボット型サーチエンジンは、あるページに対して、どれだけ別のサイトからのリンクが存在するかの統計を取って順位を決めています。掲示板やblogのコメント欄は、外部サイトのリンク数を稼ぐための格好の目標であるため、頻繁に悪用されます。

これに対し、Googleをはじめとする多くのサーチエンジンでは、リンクにref="nofollow"が含まれている場合、そのリンクは評価しないと明言しています。こちらでもそれに準拠し、自動リンク処理にこの要素を自動挿入するように改造してあります。

しかしながら、攻撃者はあくまでもbotを用いて投稿しているため、荒らしの根本的解決にはならないと思います。他にもGoogleの検索結果にリダイレクトするという新しいタイプのスパムも出てきています。

私は、禁止ワードにhttp://を挿入することを''強く''推奨します。

**JPドメイン以外キック
もっとも簡単で、抜本的なアクセス制限です。jpドメイン以外からの投稿を禁止します。ただし、この場合YahooBBやInterWebといったjpドメインでないプロバイダからの投稿も拒否してしまうため、別途許可する必要があります。

*トリップ生成機能
実はただ単に#以下の文字列をcrypt命令を使って不可逆暗号化しているだけだったりする。この命令は、普通の掲示板でパスワードを入力する際使用されている割とポピュラーな技術。2ちゃんねるの10桁トリップは、このとき生成される暗号化された文字列を後ろから10桁分を読んでいる。

なお、不可逆というのはこの暗号化処理には、再変換する命令がないため、掲示板の管理人でもそのパスワードを見ることが困難という理由から。(普通の掲示板で、パスワード入力を求めた際、送信時にこのパスワードを同じアルゴリズムで暗号化し、ログの文字列との照合をやっている)

**ソース
#code(perl){{
sub trip($){
	my $seed = shift;
	my $salt = substr($seed, 1, 2);
	$salt =~ tr/\x00-\x20\x7B-\xFF/./;
	$salt =~ tr/\x3A-\x40\x5B-\x60/A-Ga-f/;
	return(substr(crypt($seed, $salt), -10));
}
}}

**使用方法
2ちゃんねる風
 名前の欄 = $1 . "◆" . &trip($2) ;
したらば風
 名前の欄 = $1 . "(" . &trip($2) .")";