PHP 迷惑投稿対策 2021年06月30日 19:54   編集
スパム投稿対策研究のために設置した掲示板を長いこと放置していたら、スパム投稿でひどいことになっていた。対策は継続してやらないとダメのようだ。
旧掲示板のURLから今回新たに公開したbbs.phpにリダイレクトするようにした。PHP/掲示板PHP
  • ./yybbs/yybbs.cgi → ./yybbs/bbs/bbs.php
  • ./clip/clip.cgi → ./clip/bbs/bbs.php
できればスパム投稿を続けてもらって、bbs.phpがどれだけスパム防止効果があるか調べてみようということだ。とはいってもフォームから投稿してくるスパムはほとんど無いと思うので、これまでのスパムがすべて新掲示板に流れるわけではないと思うが。
・・・と思っていたが掲示板2の方はさっそく前の掲示板と同じ傾向のスパム投稿が来ている。JavaScriptのスライドロックも効果が無いので、ひょっとしたら人が投稿している?

bbs.phpのスライドロックは、ロボットはJavaScriptは無視するらしいということに期待して、JavaScriptで表示するロックを外さないと投稿できないという仕組みだ。ボタンを横にスライドするだけなので、読みにくい文字を入力したり、写真を選ぶ必要はない。この記事のテーマであるユーザーの負担が少ないスパム投稿対策というわけだ。
2024-10-16 02:23:06更新
掲示板2のスパム投稿はスライドロックでも防げないので、以前の掲示板ではあえて使っていなかった禁止ワードによる投稿ブロックも行うことにした。
禁止ワードは管理者用画面の「掲示板の設定」で設定することにした。正規表現も使用できる。たとえば、禁止ワードに
(グッチ|ブランド).+?コピー,品質保証
を指定すると、正規表現で
preg_match(/(グッチ|ブランド).+?コピー/,'投稿文字列');
preg_match(/品質保証/,'投稿文字列');
を実行し、マッチする投稿をブロックすることになる。
URLを羅列するタイプの投稿はURLを入れないと意味がないだろうから、URLに含まれる文字でブロックするのも効果的かもしれない。http://www.kopicheap.com https://www.1kopi.com www.kopi100.com https://www.topkopi.net www.topkopi.net www.kopicheap.com とかいくつか種類があるがこれは
kopi(cheap)?.*?\.(com|net)
ですべてブロックできる。

IPアドレスやホスト名によるブロックは効果がなさそうなので、見送る。

bbs.phpのスパム対策

現在bbs.phpで採用しているスパム対策は以下のようになっている。
ダミーフィールドからの投稿
スパム投稿はフォームのHTMLを解析して値を送信してくるため、CSSで非表示にしたフィールドのデータも送信する場合がある。その場合はスパムと判断して拒否する。
フォームIDのチェック
ブラウザで投稿フォームを表示するたびにユニークな投稿IDを生成し、そのIDを正しく送ってこない投稿を拒否する。フォームを表示せず、直接クエリ送信で投稿しようとするスパムを防ぐ。
投稿時間のチェック
フォームを表示してから投稿ボタンを押すまでの時間が早すぎるとロボットの投稿と判断して拒否
スライドロック
JavaScriptで表示されるボタンをスライドしないと投稿ボタンが押せず、投稿を受け付けないことによって、ロボットからの投稿を拒否する。
純粋なロボットによる投稿だと上記の対策でそこそこ効果があると思うが、突破してくる投稿も多いので、以下の対策も追加した。
ひらがなチェック
コメントにひらがなが連続2個以上含まれていないと投稿拒否
外国語の投稿をブロックするため。通常の日本語の文章なら、少なくともひらがな2個以上は含まれるはず
タイトルにURL
タイトルにURLが入っているスパムが多いため。
URL3個以上
URLを羅列するタイプの投稿を防ぐため。
禁止用語
禁止ワードを含む投稿を拒否する。
counter:24,432