にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2015/09/22. 13:18:20.

掲示板の閲覧時ではなく投稿時にだけ基本認証でアクセス制限を施してみた

誰でも投稿できる掲示板をウェブ上に用意しておくと、あっという間に大量のスパム投稿の嵐に見舞われます。

過去には、スパム投稿に対する有効な対策として、「日本語文字が全く含まれていなかったら拒否する」とか、「HTMLタグがあれば拒否する」などの方法がありました。……が、スパム投稿側も『その《スパム防止策》への対策』を施してくるので、最近はそれらの方法では防げません。外国からのスパム投稿であっても、適当な(特に意味のない)日本語文章を混ぜ込んで投稿してきますし、コメント本文中にはHTMLタグもURLも書いてこないものもあります。

上記の対策を施した上でもやってくるスパム投稿には、ブランド名を投稿者名やURLに含んだものが結構あります。(他にもあるでしょうけども、私が管理しているウェブサイトで、上記の対策をすり抜けてくるスパムには、ブランド名が含まれる投稿が多いです。)

で、これまでのところ、対症療法的な対処として、「禁止単語」をひたすら登録することでやってきました。例えば、「グッチ」とか「エルメス」とかの有名なブランド名(英語表記も含む)が含まれている場合には問答無用で拒否します。(これは、私が管理するサイトでは、このようなブランド名が話題になることはまずないからできる方法ですが。)

でも、それでも、ブランド名ではなく製品名だけを使って投稿されてくるスパムにまでは対処できません。キリがありませんし。

スパム投稿はたいてい機械的に行われるので

IEでの基本認証ダイアログ本来の利用者に手間が増えるのであまりやりたくはなかったのですが、仕方がないので、掲示板にアクセス制限を施すことにしました。基本(BASIC)認証で、IDとパスワードの入力を求めて、それがないと投稿できないようにします。IDとパスワードは、投稿直前にアナウンスするようにします。スパム投稿は、たいてい機械的に行われるので、投稿用のIDとパスワードをウェブ上に掲載していても、たぶん大丈夫だろう、と踏んでのことです。

※現状では、IDもパスワードも1種類だけの固定ですが、もしその方法が多く使われるようになれば、スパム投稿側も対処してくるでしょう。そのときには、「パスワードには今日の日付を2倍にした数字を」みたいな、言葉を解釈しないと入力できず、かつ、毎日変わるような仕組みにしないといけないかも知れません。

閲覧用CGIと投稿用CGIが分かれているなら、投稿時にだけ認証を要求する

私が運営しているいくつかの掲示板では、たまたま閲覧処理と投稿処理でCGIが分割されていたので、投稿処理用のCGIにだけ基本(Basic)認証でアクセス制限をかけてみました。認証を通過するのに必要な情報は、「投稿する」ボタンがクリックされたタイミングで、JavaScriptのalertボックスを使って表示させています。

だいたい以下のような感じです。

(1) 投稿フォームの送信ボタンのonclickイベントで、認証通過に必要な情報を表示

まず、掲示板の投稿ボタンに、以下のようにonclick属性を追記しました。

<input type="submit" value="投稿する" onclick="alert('この次の画面に移る前に「ID」と「パスワード」の入力が求められた場合には、IDとして「●●●」を、パスワードに「***」を入力して下さい。機械的なスパム投稿防止のために、アクセス認証を施していますので。お手数ですがお願い致します。');">

これで、送信処理が実行される前に、JavaScriptでアラートボックスが表示され、認証通過に必要な情報が表示されます。もちろん、JavaScriptが実行されなければ表示されませんが、まあ、今の時代にJavaScriptが無効になっているブラウザはまずないだろうということで。IEで表示すると、以下のような感じで見えます。

投稿直前に表示するアラートボックス

(2) 投稿用CGIに対してだけ、基本認証を施す

次に、.htaccessファイルを作成して、投稿用CGIにだけ認証を求めるように記述しました。

<Files "post.cgi">
   AuthType Basic
   AuthName "ID is '●●●', Password is '***'."
   AuthUserFile /home/user/www/hogehoge/.htpasswd
   require valid-user
</Files>

上記の場合は、「post.cgi」というファイルへのアクセス時だけに、基本認証を施す記述です。こうすると、特定のファイルに対してだけアクセス制限ができます。
ここでは、AuthName欄に「IDは●●●でパスワードは***」と書いているので(※これはあくまでも閲覧者に見せるために書いたものであって、実際に認証処理に使われるIDとパスワードは別途.htpasswdファイルに暗号化して記述しなければなりません)、ブラウザが表示する認証用ダイアログにもそれが表示されます。この記述は、なくても良い(ない方が良い)とも思いましたが、まあ、先のJavaScriptのアラートボックスを見逃す人も居るかもしれないと思ったので、念のために書いてみました。Firefoxで表示すると、下図のように見えます。

基本認証ダイアログ

これで、もしスパム投稿が基本認証も乗り越えてきたら、もうちょっと考えます。^^;

閲覧用CGIと投稿用CGIが分離しているフォーラム(掲示板)だと、閲覧用CGI側にアクセス制限を施す必要はないので、

  • 閲覧するだけなら、アクセス者に手間をかけずに済む
  • 検索サイトのクローラーにも内容を拾ってもらえる

というメリットがあります。
閲覧用と投稿用CGIが分かれていない場合は、全部を一括して制限するしかなく、その場合は、閲覧するだけで認証が求められるので、そもそも閲覧する人自体が減っちゃいそうです。(なので、閲覧用と投稿用のCGIが分かれていない掲示板では、今のところこの方法は使っていません。)

しばらくは、この方法で様子を見てみようと思います。
さて、どうなるかな。
まあ、少なくともしばらくの間は、これでスパム投稿は防げるとは思うのですが。

ちなみに、基本認証の設定方法やら、指定ファイルに対してだけアクセスを制限する方法については、過去にAll Aboutで解説記事を書いたので、詳しくは以下の記事をどうぞ。

基本認証でアクセス制限をかける方法(@All About ホームページ作成)
ログインページに他人がアクセスするのを拒否する方法(@All About ホームページ作成)

コメント

コメント数: 0件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---