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