まつもと ゆきひろです

In message "[ruby-list:37414] Re: Secure「ではない」script の書き方"
    on 03/03/25, Taku Nakajima <tnakajima / brain-tokyo.jp> writes:

|だから、できれば各safelevelについて、抽象的に簡潔に「このレベルの意味
|はこうです」というようなガイドラインのようなものがほしいような気がしま
|す。なんとなく、暗黙のガイドラインがすでにあるような気がするので、でき
|れば、それを明文化していただけるとありがたいです。

あちこちに書いたような気がしますが。まあ、いいや、こうなります。

  0 デフォルト。なにもしない
  1 汚染されたデータによる危険な操作の禁止
  2 プロセス関係の操作の禁止
  3 生成されるオブジェクトが汚染される
  4 信頼できないコードが実行できる

で、レベル2と3については考える必要はないと思いますので、1と4
についてだけもう少し補足しておきます。

レベル1はCGIを想定しています。外部からの入力は基本的に信頼で
きないので、信頼できないデータに基づいて行ってはいけない処理
はみな禁止します。これはそのような引数(おそらくは文字列)の
チェックに SafeStringValue() を使うことで実現できます。

レベル4については、外部から取得したプログラムのような信頼で
きない、誰が書いたかわからないようなプログラムでも実行してよ
いようなことしか許してはいけないレベルです。ですから、

  * グローバル状態の変更
  * 他のオブジェクトやスレッドの状態の取得
  * 汚染されていないオブジェクトの状態の変更

は許されません。

さて、今回のamritaの件ですが、SecurityErrorが発生するという
ことは、Rubyが「テンプレートが信頼できないかもしれない」と判
断したということです。これが「いや、〜という理由で信頼できる」
ということであれば、untaintすれば良いと思います。その理由が
正当なものであれば、別に「私を信頼するならば」というスイッチ
は不要でしょう。むしろ、そんなスイッチは有害無益でしょう。

                                まつもと ゆきひろ /:|)