実はここしばらく、海外からのbotによる当ブログへのおびただしい数のアクセスに悩まされておりました。
アクセスもとのIPアドレスはころころ変わっているのですが、通知されてくる「HTTP_USER_AGENT」に特徴がありますので、それを逆手にとってその特徴を有するユーザ・エージェントからのアクセスを無条件で却下すればいいじゃんと思いつつ、何故かなかなか実現できておりませんでした。
IPアドレスがころころ変わるため、「.htaccess」ファイルに「deny from 123.456.78.90」のような感じでちまちまIPアドレスを指定していてもきりがありません。
というわけで、Apacheのモジュールではじこうと思いました。
しかし、どういう訳か私がはじめに採用しようとしたのが「mod_security.c」による制御です。
ネットでいろいろ調べて試してみたのですが、どうもまともに動いてないようです。実際に、設定したと思い「.htaccess」ファイルをサーヴァにアップしたあとも、小憎たらしいbotからのアクセスが思いっきり確認されております。
ちなみに私が「.htaccess」ファイルに記述したのはだいたいこんな感じ。ただし、そっくりそのままではありません。
PLAIN TEXT
CODE:
<ifmodule mod_security.c>
SecFilterEngine On
SecFilterScanPOST On
SecFilterSelective HTTP_REFERER "http:/[a-zA-Z_-]{30}" "deny,nolog,status:403"
SecFilterSelective HTTP_USER_AGENT ".*bot" "deny,nolog,status:403"
</ifmodule>
正規表現でいけるかと思っていたのですが、ダメなのでしょうか?
ネットで調べると別の記述もありました。こんな感じだったかな?
PLAIN TEXT
CODE:
<ifmodule mod_security.c>
SecFilterEngine On
SecFilterScanPOST On
SecFilterDefaultAction "deny,log,status:403"
SecFilter DynamicOnly
SecFilterSelective HTTP_USER_AGENT ".*bot"
</ifmodule>
条件に合致したときのアクションをあらかじめ指定できるのですが、それでもダメでしたね。
数時間これで悩んでいたのですが、結局この方法を使うのは断念しました。
とりあえずは仮に、冒頭できりがないと言いながらも、例の小憎たらしいbotのアクセス元としてマークされたIPアドレスを片っ端からdenyする原始的な方法を執ったのですが、その後別のもっと簡単な方法があることが発覚しました。
「mod_rewrite.c」を使う方法です。
これを使えば、先ほどの「mod_security.c」よりもさらに簡単な記述でことが足りるではありませんか!
こんな感じ。
PLAIN TEXT
CODE:
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{HTTP_REFERER} "http:/[a-zA-Z_-]{30}" [OR]
RewriteCond %{HTTP_USER_AGENT} "bot"
RewriteRule ^.*$ - [F]
</ifmodule>
う~ん悔しいなぁ。せめて昨日外出するよりも前に気づいていれば!
ちなみにこの記述の場合、部分一致で正規表現を使えます。
試しに私が愛用するOperaブラウザで動作の確認をしてみたのですが、たとえば
RewriteCond %{HTTP_USER_AGENT} "Opera"
や
RewriteCond %{HTTP_USER_AGENT} "pera"
また、
RewriteCond %{HTTP_USER_AGENT} ".*pera"
のときはOperaからのアクセスが却下されることを確認しております。
もちろん、
RewriteCond %{HTTP_USER_AGENT} "Gpera"
などの場合にはちゃんとOperaからのアクセスが通ることも確認済みです。
ちなみに、「mod_security.c」関係をいじっていたときは、何故かOperaでの動作確認が出来たり出来なかったりと、不可解な動きになっていました。
私がこの機能をよく理解していないだけなのかもしれませんが、いずれにせよ不確実な「mod_security.c」よりも、より確実な「mod_rewrite.c」を採用することにしました。
本当に小憎たらしいbotのアクセスを完全に遮断できているかどうかについては、しばらく様子を見て判断したいと思います。