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 を作れると思います。でも自信はない。