From: "5.5" <5.5@...> Date: 2014-07-07T23:01:32+09:00 Subject: [ruby-list:49863] Re: テンプレートシステムを安全に使う 5.5 です。 松尾さん,ご教示ありがとうございます。 (14/07/07 13:48), Aiga Matsuo wrote: > 松尾です。 > > 数年前に同じような局面があって、Rubyのsafe levelを利用したことがあります。 Ruby のセーフレベルって,こういうふうに使えるんですね! たしか,Ruby を知り始めた頃,アスキーの『オブジェクト指向スクリプト 言語 Ruby』で読んでみたんですが,チンプンカンプンでした。 (本が悪いのでなく,読んで分かる素地が当時無かったのでしょう) > エッセンスとしては下記のようなコードを書きました。。 > > require 'erb' > > @erb = ERB.new('<%= IO.read("/etc/passwd") %>') > > Thread.start do > $SAFE = 3 > print @erb.result(binding) # => SecurityError > end.join これはとても分かりやすいですね。このサンプルと,るりまの解説を読ん で,ようやく分かってきました。 Thread.start を使っているのは,セーフレベルの変更を局所化するため なのですね。 > 最近のRubyだと$SAFE=4がobsoleteになったので3にしていますがsandboxとして > それなりに動作します。 > $SAFE=4がなぜ排除されたのかあたりの事情を知らないのでこの辺りは突っ込ん > で調べておいたほうが良さそうですが。 そうですね。 結局,$SAFE=0, 1 は何となく分かりましたが,2, 3, 4 はよく分かりま せんでした。 ruby-list の過去メールを見ても,3 は 4 を用意するためにあるという ようなことが書かれていて,それでなぜ 4 だけ廃止するのかなと思った り。 -- 5.5@moji.gr.jp