技術系

CGI::Cookieの仕様。

my $c = new CGI::Cookie(-name => 'foo',
-value => ['bar','baz'],
-expires => '+3M');

print header(-cookie=>$c);

のような処理をしたときに、-nameがfooの値を取得しようとすると、帰ってくるのは['bar', 'baz']ではなくて、('bar','baz')という罠。
配列リファレンスを保存していた場合は、配列が帰って来るんだってさ。質問されて困った。そんな変な仕様くっつけるなよ・・・

そういえば、CGI.pmも同じような仕様を持ってるよね。
例えば、チェックボックスなんかで、typeを複数指定する場合、
$cgi = new CGI;
@array = $cgi->param('type');
で受けれる。というか、
$var = $cgi->param('type');
だと、最後の一つしか受けれない。これは多分、HTTP自体の仕様の問題なんだと思う。だって、typeが複数存在する場合、
http://someaddress/some.cgi?type=aaa&type=bbb
って送るんだよ?nameを複数指定できるかどうかも分からないのに、勝手に配列リファレンスにしたら、例えば一つしかないnameのような物を強引に二つ送信することで、用意にシステムクラックが出来ちゃうわけだし。

この点、PHPは理にかなってると言えるかもしれない。
配列が送りたければ、name="type[]"というように送るんだから。
ただ、同名の変数に勝手に代入する点は問題だと思う。だって、これはグローバル変数を初期化しないで使ってる場合に、いくらでもクラックの要素が出来てしまうわけだから。
一応$_POST['name']みたいな方法があるらしいけど・・・・同名のグローバル変数に保存するから分かりやすいなんて、誰が言い出したんだ?
下手なことしたら、すぐに問題になるじゃないか。
グローバル変数くらい、スクリプト書く人間に管理させてくれ。誰か分からないようなユーザーに触られたくない。