From: Shugo Maeda Date: 2005-08-17T11:39:58+09:00 Subject: [ruby-dev:26807] Re: $SAFE=1 の open-uri で redirect 時にエラー 前田です。 Tanaka Akira wrote: >>私の理解だと、untaintする時は`You may not use data derived >>from outside your program to affect something else outside your >>program'という原則から外れるので、プログラマの裁量でuntaint >>するものだと思っていました。 >> >>もしそうだとすると、Rubyの場合と判断の対象となる操作の量の違いしか >>ないのではないでしょうか。 > > > その操作の量の違いは大きな違いではないでしょうか。 その点については、同意します。 田中さんの主張は、「Perlの方が指針がはっきりしているため、Rubyよりも 好ましい」というものだと理解していましたので、それに対する反論として 上記のように書きました。 taint機構の対象範囲の違いを軽視しているわけではありません。 > たくさんあればあるほど、判断に失敗する機会が増え、また判断自体は適切で > あったとしてもその判断がユーザが伝わらずに齟齬が生じて失敗する可能性が > 増えます。 前者に関しては、Perlでは何もチェックしないケースに対してチェックミス があったとしても、Perlより危険になることはないと考えます。 また、 def delete_files(list_filename) open(list_filename) do |f| for line in f File.unlink(line.chomp.untaint) end end end のようなメソッドがあった場合、Rubyではlist_filenameが汚染されていれば open操作で失敗するわけですが、Perlの場合には同様のコードだとopenの時点 では処理が続行されてしまいます。 上記の例そのままのようなコードはあまりありそうにないように思われますが、 たとえば、URLを引数に取って、そのURLから取得した情報をもとにプログラム の外部に影響を及ぼすような操作をすることは十分に考えられると思います。 そのような際には安全なライブラリにするためには、汚染チェックを自前で 行ったエラーを発生させるようなコードを書かなければなりません。 Perlの方が判断が楽なので安全だとは、一概には言えないのではないでしょうか。 > したがって問題はバランスなわけですが、前田さんの提案は、perl のバラン > スよりも望ましいでしょうか? 私はそう考えています。 -- 前田 修吾