これは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を悪者にされると、うれしい人より困る人の方が多いのは確かだと思う。ただのHEAD
をHEAD -H'User-Agent: GoodBot/0.1'
と打たなくてはならないというだけでも、システム管理者の手間が増えるというものだ(aliasしろって?それだって手間じゃないか!)。
この手のいたちごっこはネットの風物詩ではあるけれど、固有名詞決め打ちというのはなんとかならんのだろうか....
Dan the LWP Monger
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。