2007年04月10日 18:00 [Edit]

perl+apache - LWPを責めないで

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


この記事へのトラックバックURL

この記事へのトラックバック
404 Blog Not Found:perl apache - LWPを責めないで [blog.livedoor.jp] よく使われるツールが凶器として用いられるのはどの世界でも共通しているとはいえ、LWPを使った場合のlibwww-perlをデフォルトで跳ねるのはどうかと思う。少なくとも通常のGETリクエストではねるのは行...
MIME::LiteのデフォルトのX-Mailerを変える【M.C.P.C.】at 2007年04月11日 00:53
この記事へのコメント
また嫌Perl厨か
Posted by 。 at 2007年04月12日 03:15
「libwww-perlを使って有益なものを作る人は、アクセスはじきをされたく
なければAgent表記をそのままにせず固有の名前を名乗りましょう」
という啓蒙をすればいいだけのことなのに、なぜ現実的なスクリーニングを
している人を叩くのかよくわかりません。

「libwww-perl禁止法」が制定されようとしているのなら、反対するのは
もっともですが、サーバがどんなアクセスを受け入れようが自由なはずです。

「どうかと思う」とか、「行き過ぎ」とか、Googleが頼んでlibwww-perlを
作ってもらったわけじゃないのに、なぜPerl世界の人はこんなに傲慢なので
しょうか。
Posted by rero at 2007年04月11日 14:21
独自のuserAgentを名乗ってくれればいいですが、既存の名前を詐称しますからね。情報量は増えないと思います。
Posted by もぎゃ at 2007年04月10日 22:57
「本当に悪いやつ」がAgent表記を変えてくれれば、それを弾く方法は「libwwwのなかから悪いものだけ弾く」方法よりも、情報量が多い分だけやりやすいのかもしれません。
Posted by kawaguti at 2007年04月10日 19:22