Safe level 4 からの脱出

Rubyでは、一度セーフレベル4に設定してしまうと、そこからセーフレベルを0などに変更することは出来ません。しかし場合によってはどうしてもセーフレベル4環境から一時的に脱出したい場合もあるかと思います。こんな時には Proc を使いましょう。Proc は定義時点でのセーフレベルを記憶してくれるので、それを呼び出すことで一時的にセーフレベルを変えることが出来ます。

# safe level 0
safe_open = proc { File.open("test.rb") }

thread = Thread.start do
  $SAFE = 4
  safe_open.call
end

thread.value #=> ex. #<File:0xb7c967d0>

thread = Thread.start do
  $SAFE = 4
  File.open("test.rb")
end

thread.value #=> Insecure operation

というわけで、安全だと思えるコードを事前に proc に詰めてやって、それをセーフレベル4から呼び出す感じで書いていくと良いと思います。でもprocの中で無闇やたらと taint したら台無しだよね。程々に?

追記

なお、このテクニックはRamazeさんの session flash をセーフレベル4環境で扱うのに必須。

module Ramaze
  class Session::Flash
    alias :combined_orig :combined

    def initialize(session)
      @session = session
      @safe_combined = proc { combined_orig }
    end

    def combined
      @safe_combined.call
    end
  end
end

みたいな感じにすると信頼できないテンプレートを扱わざる得ない場面においても安全に flashbox を作れると思います。でも自信はない。