From: matz@... (Yukihiro Matsumoto) Date: 2003-03-25T14:03:48+09:00 Subject: [ruby-list:37415] Re: Secure「ではない」script の書き方 まつもと ゆきひろです In message "[ruby-list:37414] Re: Secure「ではない」script の書き方" on 03/03/25, Taku Nakajima writes: |だから、できれば各safelevelについて、抽象的に簡潔に「このレベルの意味 |はこうです」というようなガイドラインのようなものがほしいような気がしま |す。なんとなく、暗黙のガイドラインがすでにあるような気がするので、でき |れば、それを明文化していただけるとありがたいです。 あちこちに書いたような気がしますが。まあ、いいや、こうなります。 0 デフォルト。なにもしない 1 汚染されたデータによる危険な操作の禁止 2 プロセス関係の操作の禁止 3 生成されるオブジェクトが汚染される 4 信頼できないコードが実行できる で、レベル2と3については考える必要はないと思いますので、1と4 についてだけもう少し補足しておきます。 レベル1はCGIを想定しています。外部からの入力は基本的に信頼で きないので、信頼できないデータに基づいて行ってはいけない処理 はみな禁止します。これはそのような引数(おそらくは文字列)の チェックに SafeStringValue() を使うことで実現できます。 レベル4については、外部から取得したプログラムのような信頼で きない、誰が書いたかわからないようなプログラムでも実行してよ いようなことしか許してはいけないレベルです。ですから、 * グローバル状態の変更 * 他のオブジェクトやスレッドの状態の取得 * 汚染されていないオブジェクトの状態の変更 は許されません。 さて、今回のamritaの件ですが、SecurityErrorが発生するという ことは、Rubyが「テンプレートが信頼できないかもしれない」と判 断したということです。これが「いや、〜という理由で信頼できる」 ということであれば、untaintすれば良いと思います。その理由が 正当なものであれば、別に「私を信頼するならば」というスイッチ は不要でしょう。むしろ、そんなスイッチは有害無益でしょう。 まつもと ゆきひろ /:|)