camel

これはPerl Mongerとして一言言っておかねばなるまい。

Googleにもアクセス拒否され、スパム送信源と化した「libwww-perl」とは? - GIGAZINE
スパム対策をして気がついたのですが、どうやらスパムトラックバックを送信してくるリモートホスト(IPアドレスなど)はバラバラであっても、ユーザーエージェント、いわゆるブラウザの名称部分に「libwww-perl/5.805」というように「libwww-perl」と入っているものが多く、結果として、Googleなどは検索結果ページに対してこのユーザーエージェント名の一部「libwww」が含まれているとアクセス拒否しているようです。

LWPことlibwww-perlは、Webボットの実装としては最も多く利用されているPerl Module。なにしろLWPを使うと、Webコンテンツにアクセスするのがこんなに簡単になるのだ。

% perl -MLWP::Simple -e 'print get("http://www.dan.co.jp/")'

LWPをインストールすると、GET,HEAD,そしてPOSTといった、HTTP Requestメソッドの名前そのもののスクリプトもlwp-requestのaliasとしてインストールされるので、これらを使えばさらにアクセスは簡単になる。

% GET http://www.dan.co.jp/

このように、LWPはperlでWebクライアントを開発する場合には書かせないモジュールであり、右のように本まで出ている。LWP専科ではないが、「Webクライアントプログラミング」でもページのかなりの部分をLWPの解説に割いている。

よく使われるツールが凶器として用いられるのはどの世界でも共通しているとはいえ、LWPを使った場合のlibwww-perlをデフォルトで跳ねるのはどうかと思う。少なくとも通常のGETリクエストではねるのは行き過ぎだと思う。

GIGAZINEの記事でも触れられているように、このデフォルトは簡単に変更することが出来る。プログラム内で使っているなら

my $ua = LWP::UserAgent->new()

my $ua = LWP::UserAgent->new(agent => "GoodBot/0.1");

とかとするだけだし、コマンドラインなら

% HEAD 'http://www.google.com/search?q=dankogai'
403 Forbidden
Date: Tue, 10 Apr 2007 08:47:04 GMT
Server: GWS/2.1
Content-Length: 4168
Content-Type: text/html
Client-Date: Tue, 10 Apr 2007 08:46:56 GMT
Client-Peer: 66.249.89.99:80
Client-Response-Num: 1

% HEAD -H'User-Agent: GoodBot/0.1' 'http://www.google.com/search?q=dankogai'
200 OK
Cache-Control: private
Date: Tue, 10 Apr 2007 08:47:06 GMT
Server: GWS/2.1
Content-Length: 0
Content-Type: text/html; charset=ISO-8859-1
Client-Date: Tue, 10 Apr 2007 08:46:58 GMT
Client-Peer: 66.249.89.99:80
Client-Response-Num: 1
Set-Cookie: PREF=ID=7173e84f40a0bb3d:TM=1176194826:LM=1176194826:S=PLs7fu_ZAWMomwhu; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com

-H'User-Agent: GoodBot/0.1'と付けるだけでいい。本当に悪い奴なら、とっくにUser Agentを偽装しているはずだ。

それでもどうしてもLWPを排除したいというのであれば、POSTリクエストのみ排除するとか、もう少しやり方はある。例えば

SetEnvIf User-Agent "^libwww" deny_ua
Order allow,deny
Allow from all
Deny from env=deny_ua

を、

SetEnvIf User-Agent "^libwww" ua_is_a_bot
<limit POST PUT DELETE>
Order allow,deny
Allow from all
Deny from env=ua_is_a_bot
</limit>

とするなり、あるいはいっそホワイトリスト方式にして、

SetEnvIf User-Agent "^(Mozilla|Opera)" ua_isnt_a_bot
<limit POST PUT DELETE>
Order allow,deny
Allow from env=ua_isnt_a_bot
Deny from all
</limit>

とかするとか。

もちろん、本当に悪い奴ならUser Agentの偽装は真っ先にやっているはずではあるのだけど。

とにもかくにも、LWPを悪者にされると、うれしい人より困る人の方が多いのは確かだと思う。ただのHEADHEAD -H'User-Agent: GoodBot/0.1'と打たなくてはならないというだけでも、システム管理者の手間が増えるというものだ(aliasしろって?それだって手間じゃないか!)。

この手のいたちごっこはネットの風物詩ではあるけれど、固有名詞決め打ちというのはなんとかならんのだろうか....

Dan the LWP Monger