From: "TAKAGI, Hiromitsu" Date: 2001-12-29T08:52:36+09:00 Subject: [ruby-list:33102] Re: cgi.rb で cookie の encoding について すみません、撤回します。 On Sat, 29 Dec 2001 07:00:29 +0900 "TAKAGI, Hiromitsu" wrote: > 前者は、適切なunescapeを行わない手抜きスクリプトに原因があるのであって、 > それに対応する必要があるというのは特殊ケースですよね。そのような必要性 > がある場合には、cgi.rb を使わずに直接 cookieを発行するように書くのが正 > しいのでは? この発言を撤回し、 On Fri, 28 Dec 2001 10:43:56 +0900 Beyond wrote: > さて、cgi.rb でクッキーを発行する際、英数字以外は全て URL-エンコーディン > グするようですが、これはやりすぎでは無いでしょうか? こちらに同意します。しかし、 > で、ユーザーが encoding したものとの区別をつけるために、'%', '+' の > encodeもするとして、以下のような感じでいかがでしょうか? > def escape(string) > string.gsub(/([%+,;]+)/n) do > '%' + $1.unpack('H2' * $1.size).join('%').upcase > end.tr(' ', '+') > end これには同意しません。 つまり、cookieにprintableでない文字を入れる場合、それをescapeするのは、 そのコードを書く者の責任であるとするのが正しいと思います。 これは、ちょうど、URLにおけるURLエンコードで、例えば、 http://.../foo.cgi?aaa=111&bbb=222&ccc=333 というときに「&」を「%26」にescapeしないというのは、このURLを構築する コードを書いた者の意思によって決定されているのであって、必ずしも区切り 記号は「&」とは限らないわけですよね。このURLを構築するコードは、 "foo.cgi?" + "aaa" + escape(val_aaa) + "&" + "bbb" + escape(val_bbb) + ... と書くわけで、もし「val_aaa」内に文字「&」が含まれていればそれは「%26」 にエスケープされなくてはならないわけで。 cookieをセットする際も、本来はこのようにして書くものだと思います。 ただ、現状の cgi.rb は、こうした作業を不要にする、より高度に抽象化され たCGIライブラリだとみなすこともできます。この見方をする場合、複数の値 をcookieのvalueに入れたい場合には、 cookie.value = ['...', '...'] を使うことになっていて、区切り記号が「&」に固定されている、と。 それでいいのか?(区切り記号を「&」に固定してよいのか?)という議論は あってもよいと思います。 高木 浩光@独立行政法人産業技術総合研究所 http://staff.aist.go.jp/takagi.hiromitsu/