12時22分10秒 [Web関連]
「BBS」や「ブログのコメント欄」や「メッセージフォーム」などのように、「何かを入力して送信できる」仕組みをウェブ上に公開していると、スパム投稿がたくさんやってきます。
なので、スパムを回避する仕組みを用意することになるわけですが、「スパムを回避する仕組み」を回避してくるスパム投稿も徐々に増えてくるため、いたちごっこです。
IPアドレスの制限は無意味
初期の頃は、それほど投稿数も多くなかった上に、投稿元のIPアドレスがほぼ固定だったので、IPアドレス単位でブラックリストに追加していけば対処できていました。でも今では異なるIPアドレスを大量に使い分けてくるのは当たり前なので、IPアドレスによるブロックは無意味です。20~30個くらいの大量投稿を一気に送ってくる場合でも、見事に全部異なるIPアドレスが使われていたりします。
スパム業者は爆発すればいいのに……。(-_-)
URLを含むとブロック
たいていのスパムは、スパムサイトへの誘導やSEO効果の獲得が目的なので、URLを書かないと意味がないのですよね。なので、『本文中にURLが含まれていたら問答無用で却下』という対策が取れるなら、そこそこ有効ではあります。(でも、中にはURLもメールアドレスも一切含まないスパムもあって、何が目的なんだろう?と困惑するものもあるんですが……。)
でも、「投稿者のウェブサイトの情報は書けるようにしたい」という場合もあります。
そういう場合には、「コメント本文にURLを含めたらアウトだけど、専用の入力欄に1つだけ入力した場合はOK」のようにします。……が、まあ、そうすると当然、そっちにスパムサイトのURLを書いたスパム投稿が来るわけですね。当たり前ですが。(^_^;;;
なので、URL以外の部分でスパムかどうかを自動判定させたいわけです。
日本語が存在するかどうか
日本語サイトで、日本語での投稿を前提とする場合には、『日本語が存在しなかったら却下』という手が使えます。これが、数年前まではわりと有効だったように思います。
日本語の文字はたくさんありますが、文字コードでは「この番号からこの番号までが漢字」みたいな区切りがあるので、それを利用して「指定範囲内にある文字だけを許可する」のような処理ができます。もしくは単純に「2バイト文字があるかどうか」だけの判定でも十分な頃もありました。それらの方法で、英語だけとか、ロシア語だけ……といったスパム投稿は完全にブロックできていました。
(外国からのスパムがたいてい英語だった頃は、英語スパムだけをターゲットにすれば良かったので、「this」・「that」みたいな頻出の英単語を禁止単語に指定しておくことでも、わりと自動対処できましたが。今ではロシア語とか中国語とかのスパムもたくさんあるので、その方法では不足です。)
で、そのうち、本文中にほんの少しだけ2バイト文字(日本語文字など)を含ませたスパム投稿が出てきたんですよね……。すると、日本語文字の存在をチェックしているだけでは、判定をすり抜けてしまいます。
平仮名が存在するかどうか
なので、ちょっと制限を厳しくして、『ひらがなを1文字も含まない投稿は却下』という対策に変えることで、しばらくは有効でした。
日本語の文章の場合、ひらがなを1文字も含まないことは(ほぼ)ないでしょうからね。
でも、スパム投稿側にも、ひらがなを1文字だけ含めてくる……みたいな回避策が出てきたので、
句読点が存在するかどうか
もっと厳しくして、『句読点を1文字も含まない投稿は却下』のようにすると、さらに有効でした。
日本語による投稿であっても、驚嘆文と疑問文だけしか書かない場合には、文末に「!」と「?」が使われるので句読点が1文字もないことはあるかも知れませんが。(笑)
あと、そもそも普段から句読点をまったく使わない人も居ますしね……。
でもまあ、そういう投稿の場合には、「句読点を書いてね」のような表示をすることで対処できます。戻って投稿し直す手間を掛けることにはなりますが、「句読点」という言葉の意味が分かれば、何を追加すれば良いのかは簡単に分かりますから。
これが結構長い間有効だったように思います。
しかーし!
適当に拾ってきた文章を使ってくる!
スパム業者の回避能力も年々向上していまして、最近は、「ネット上で適当に収集したそこそこ長い日本語文」を使って投稿してくるのですよ……。内容に全然脈絡はないんですが、日本語としては成立しているので、「日本語の有無」とか「句読点の有無」のような対策ではブロックできません。
これが結構困ります。
ちゃんと日本語として成立している文章なので、ぱっと見ただけではスパムだとは思えません。なので、ある程度読んじゃうんですよね。「なんでこんな関係ない話を書いてくるんだ、この人は……?」と思って、「おかしいな……、投稿先を間違えたのかな?」と思い、人物名を見ると「グッチ」、URL欄を見ると「チープグッチ・ドットコム」みたいなスパムURLになっていたり……。
スパム業者、爆発しろ!(-_-メ)
もっと巧妙なのは、「ブログのコメント投稿欄」のように、「コメント欄の上部に、そこそこ長い文章が掲載されているページ」の場合、その本文内から適当に抜粋した文字列をそのまま使って投稿してくるんですよ。
その場合、一見すると脈絡があるように感じてしまいます。話題が同じなので。
よーく見ると、「あれ? これって本文のコピペじゃない?」と気付くわけですが。
キーワードブラックリスト
最近は、(少なくとも私が管理している範囲では)どうもブランド名を含んだスパム投稿が多いので、いっそ国内外のあらゆるブランド名を列挙したデータを作って、それらを含む投稿を一括ブロックしようかとも思ったりしています……。(^_^;;;
私のサイトの場合だと、ブランド名をコメントに含めるような話題が出ることはまずありませんし。(^_^;;;
スパムサイトは、SEO効果を気にしているので、URL内にもブランド名がそのまま使われていることも多々あります。その点でもブロックしやすいかも知れません。
でもまあ、URLに使われているドメイン名すらランダム文字列にしか見えないスパムサイトもありますが……。
それに、多いとはいえ全部ではありませんしね……。日本語表記と英語表記だけならともかく、ロシア語や中国語でのブランド名は分かりませんし。(調べてリストアップするのも面倒ですし。)
URL欄・NAME欄に何か書いたらアウト
そこで、新たな対策として最近は、ダミーの「URL入力欄」・ダミーの「NAME入力欄」を用意しておいて、そこに何かを入力された投稿は、問答無用で却下……という対策を取っています。ダミーの入力欄は、CSSを使って、ブラウザ上では見えないようにしてあるので、CSSを無効にしているような特殊な環境でない限り、ダミーの入力欄は見えません。
スパム業者は、1ページ1ページ人力で入力欄をチェックしたりなど当然していません。クローラーに巡回させて、入力欄のあるページを片っ端から収集しているのでしょう。
なので、HTML内に入力欄があれば、それらの中に非表示になっているダミー入力欄があるとは考えないはずです。
今の入力フォームの項目名は、そのものずばりシンプルすぎるんですよね。
- 「name」が、名前の入力欄
- 「url」が、URLの入力欄
- 「comment」が、コメント本文の入力欄
……のように。
なので、それを以下のようにします。
- 「ix-jPa81」が、名前の入力欄
- 「jxtw0fy9」が、URLの入力欄
- 「ppxy3Iha」が、コメント本文の入力欄
- 「name」が、ダミーの入力欄(何か入力したら問答無用で拒否)
- 「url」も、ダミーの入力欄(何か入力したら問答無用で拒否)
- 「comment」も、ダミーの入力欄(何か入力したら問答無用で拒否)
……のような。(^_^;;;
正規の入力欄に使われている項目名は、動的に生成するようにして、毎回異なるとさらに良いかも知れません。
HTML内に存在しない項目に何か書いたらアウト
スパム投稿では、そもそも投稿ページ(HTML)側に「どのような入力欄があるか」すらチェックしておらず、直接CGIに(name欄やurl欄があることを前提にした)データを送っている場合もありそうです。
その場合、送られてくる投稿データ内には、「HTML側には用意していない名称の項目」も含まれている可能性が高いでしょう。そこもチェックするようにして、「HTML側で用意していない入力欄」に対するデータがあったら拒否、としても良いかもしれません。(使っているCGIが、様々なページから共通に利用されている汎用なものだったらちょっと面倒ですが。)
CAPTCHA
まあでも、スパム対策で強いのは、たぶん「CAPTCHA」(キャプチャ)ですよね。
CAPTCHAというのは、自動解析にしにくい「歪んだ文字列」が表示される画像を読んで、そこに描かれている文字が何なのかの入力を求めることで、「入力者がコンピュータではない」ことを確認する仕組みです。
大手企業が提供するサービスでの、アカウント開設画面などでよく使われています。
人間の側にも多少の面倒を強いることになりますが。
これを使えたら、スパム投稿もほぼ防げるんでしょうねえ……。(^_^;;;