まつもとさん、こんにちは。

返事が遅くなってしまって申し訳ございません。

At 20:33 08/10/17, Yukihiro Matsumoto wrote:
>まつもと ゆきひろです
>
>In message "Re: [ruby-dev:36764] Re: [ruby-cvs:27036] Ruby:r19818 (trunk): 
>* transcode.c  (str_transcode0): String#encode without argument now"
>    on Fri, 17 Oct 2008 19:46:39 +0900, Martin Duerst 
><duerst / it.aoyama.ac.jp> writes:
>
>|>    * transcode.c (str_transcode0): String#encode without argument now
>|>      behave as if :undef => :replace, :invalid => :replace specified.
>|
>|これを是非戻して欲しいです。:replace は security 関係で色々問題なので、
>|使う側から明示的に設定していただかないと使わない方がいいです。

先ず、これを帰る寸前であわてて書いてしまったことを謝らないといけません。

security 関係で本格的に問題になるのは :ignore の方で、:replace では
ありません。:ignore に比べて :replace はあまり問題はないと思っています。
firewall など何かのチェックを通った後に変換で悪いものに化け、
問題を起こすのは一般的なパターンです。例えば ../ (や ..\) を
.X./ (ここでは X は :undef や :invalid なもの) で隠して、:ignore
によって X が消えるとか。:replace の場合は .R./ になって、現在の
実装では UTF-8 の場合には R は U+FFFD で何かと勘違いされる問題は
無い筈。UTF-8 以外では R は '?' になって、その '?' によって何か
危ないことができたら問題になる。 全くないとはいいきれなくても、
具体的になにかありそうなものは知りません。

>成瀬さんからすでに質問が出ていますので、そちらをよろしくお願
>いします。
>
>で、今回の修正ですが、encodeメソッド全体の挙動を変えるのでは
>なく、新たに追加された引数なしのencode(default_internalに変
>換する)に対してのみです。これはショートカットと思っています。
>ちゃんと変換する時にはもちろんreplaceは使いません。

元々こちらで例外に相当疑問がありましたし、これをまつもとさんに
も伝えました。そういう意味では成瀬さんの「例外がよいと言う場合は、
その例外を使う側はどう扱うべきかも」もよく分かります。しかし
これは引数無しの encode だけではなく、引数付きの encode でも
そうではないかと思います。

現在のこちら (だけかもしれません) の結論からいいますと、encode
を全部 (引数付きか無しかを関係なく) :replace にしてもいいではないかと
思います。

宜しくお願いします。    Martin.


#-#-#  Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University
#-#-#  http://www.sw.it.aoyama.ac.jp       mailto:duerst / it.aoyama.ac.jp