迷惑投稿対策 2017年03月24日 20:53   編集

リンク元 ユーザーエージェント

スパム投稿の動向を分析するためで環境変数でリンク元やユーザーエージェントをログに残してみたが、こうした情報もスパムかどうか判定するヒントになるかもしれない。
リンク元はPerlの場合、環境変数$ENV{'HTTP_REFERER'}で得られる。たとえばこのページのリンクから掲示板にアクセスしたら
http://shade-search.com/sts/term/term.php
がHTTP_REFERERになる。いったん掲示板を開いて掲示板の他のページから移動した場合は掲示板CGIのURL たとえば
http://shade-search.com/sts/fsw/yybbs/yybbs.cgi?type=2
のようなものになるはずだ。 この掲示板のURLをブックマークに保存していて、ブックマークから直接掲示板を開いた場合はHTTP_REFERERは空になるが、わざわざこの研究用掲示板をブックマークしているユーザーがそんなにいるはずはない。やたらリンク元なしや上記のtermやyybbs以外のURLから来たということになっているアクセスが多いが、ほとんどがスパムだと思われる。

より参考になるのは、フォーム表示時より、投稿時のHTTP_REFERERだ。
投稿するためにはフォームを表示しておく必要があり、正常な投稿ならまず間違いなくフォームを表示するCGIのURLになっているはずだ。ブックマークから直接投稿するということはあり得ないので、投稿時のHTTP_REFERERが掲示板CGIのURLになっていない場合はまずブロックして問題ないと思われる。
しかし、HTTP_REFERERはけっこう偽装してくるロボットも多いらしいので、逆に掲示板CGIのURLになっていても、本当にそこから投稿してきたかどうかはわからない。

ユーザーエージェントは$ENV{'HTTP_USER_AGENT'}で得られる情報で、ユーザーのOSやブラウザの情報が得られる。これはロボットだけでなくブラウザも偽装するものがあるので、情報としてはあまり当てにはならないが、空になっていたり、defaultなどとなっていたらあやしいといえるだろう。

全角チェック→ひらがなチェック

投稿内容に日本語が含まれていない場合、投稿を拒否するオプションが組み込まれている掲示板は多い。しかし言語によっては、文字化け部分が漢字になってしまって、日本語チェックを通ってしまうことがある。
この実験用掲示板では日本語チェックは
$in{comment} !~ /[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]/
という正規表現でのチェックとなっていた。これは全角文字が含まれているかどうかのチェックだと思うが
Atenderemos su convocatoria lo m疽 veloz
posible, como encima, los avisos se pueden dar en cualquier momento, disponemos, a una parte
de nuestro servicio com佖, de un servicio de 24 Horas.
というような投稿は受け付けてしまう。こうした投稿も拒否するには正規表現を
$in{comment} !~ /([\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]){2}/
として全角文字が続けて2個以上含まれているかどうかチェックしたり、
$in{comment} !~ /\x82[\x9F-\xF1]/
として、ひらがなが含まれているかどうかのチェックに変更することによって、上記の投稿もブロックできる。
カタカナもチェックしてもいいのだが、カタカナだけの投稿というのも普通ないと思うので、いらないだろう。
この実験用掲示板の常連のひらがなタイトルのスパムはこのひらがなチェックをクリアするためのスタイルなのかもしれない。
日本人を対象とした掲示板なら、投稿内容にひらがなが含まれていないケースは少ないと思うので、
$in{comment} !~ /(\x82[\x9F-\xF1]){2}/
というひらがな2個以上チェックが有効かもしれない。

ちなみに上記の正規表現は文字コードがShift-JISの場合で、文字コードが変わるとコードが変わるので表記も変わる。
utf-8の場合は
'/[ぁ-ん]{2}/u'
のような表記でいける。
'/[ぁ-ゞ]{2}/u'
とする場合もあるようだ。この場合「ゔ」とか「ゝ」などの文字も対象になる。
utf-8の場合はuオプションが必要らしい。
Shift-JISではこのような表記を使うとエラーが出ので、コード表記にする必要があるらしい。

今後の予定

投稿フォームにアクセスしてくるスパムは、ブロックしたスパム投稿の何倍もありそうだが、あまり数が多いとこれもサーバーへの負担となる。ブロックされたスパムのIPアドレス、ホスト名はログに残しているので、こうしたアクセスは.htaccessでブロックしてしまえばWEBプログラムへの負担が少なくて済むのではないか。
deny from 91.200.12.119
deny from 91.200.12.149
のように書いてブロックすることになると思う。
同じホストで複数のIPアドレスを使っているケースもあるので、ホスト名で拒否する方法もあるが、そうするとWEBサーバーの負担が大きいらしい。
処理としてはスパムと判定して投稿を拒否した場合、IPアドレスが.htaccessの拒否リストに存在するかどうか調べ、存在しなければ追加するということになる。.htaccessは掲示板を設置したディレクトリに限定する必要は無いかもしれない。掲示板以外でもスパムにきてもらうメリットはないので、サイト全体のディレクトリに設置してブロックしてもいいと思う。
counter:5,239