String#intern
影舞をhogeっていてうまく動かないのでなぜかと思ったら、Ruby 1.8.5からは、セーフモード1では汚染されたStringインスタンスに対してString#internするとSecurityErrorになるのだそうだ。Hashのキーを入力から取ってinternしようとしてSecurityError。
しかし何をどうすればuntaintされたと判断すればいいのか、さっぱり分からん。CVSのソースを見るといきなりuntaintだし。
CGIの引数に対してそれでいいのか?
しかしとりあえず手元で動かしてみているだけなので、ひとまずいきなりuntaintで対応。2箇所ほど直したらエラーは出なくなったが。やや不安。
diff -uNr kagemai-0.8.6.old/lib/kagemai/message_bundle.rb kagemai-0.8.6.new/lib/kagemai/message_bundle.rb --- kagemai-0.8.6.old/lib/kagemai/message_bundle.rb 2004-07-06 20:44:35.000000000 +0900 +++ kagemai-0.8.6.new/lib/kagemai/message_bundle.rb 2007-01-17 19:11:25.000000000 +0900 @@ -62,7 +62,7 @@ next if line.empty? key, *message = line.split(/=/) - key = key.to_s.strip + key = key.to_s.strip.untaint message = message.join('=').to_s.strip next if (key.empty? || message.empty?) diff -uNr kagemai-0.8.6.old/lib/kagemai/reporttype.rb kagemai-0.8.6.new/lib/kagemai/reporttype.rb --- kagemai-0.8.6.old/lib/kagemai/reporttype.rb 2004-07-06 20:44:35.000000000 +0900 +++ kagemai-0.8.6.new/lib/kagemai/reporttype.rb 2007-01-17 19:12:01.000000000 +0900 @@ -171,7 +171,7 @@ attr_u = Hash.new attr.each {|key, value| - attr_u[key.intern.to_s.untaint] = value.dup.untaint # untaint key/value. + attr_u[key.dup.untaint.intern.to_s] = value.dup.untaint # untaint key/value. } attr = attr_u