From: Kiyotaka ATSUMI Date: 2008-12-02T17:31:17+09:00 Subject: [ruby-list:45665] Re: セキュリティ制御モデルの改善について 渥美です. 早速のご質問有難うございます. "Makoto Kuwata" wrote (Tue, 2 Dec 2008 13:43:43 +0900) > * 複数の引数を取るようなメソッドの場合はどのようになりますか。 あるメソッドが2つ以上の引数を取る場合,その引数は全て当該オブジェクト について安全でなければなりません. 例えば以下のコードですが, ----- BEGIN ----- BEGIN ----- BEGIN ----- BEGIN ----- BEGIN ----- class Html def wash(a) a.gsub!(//, '>') return true end gate_public def foo(a, b) puts a puts b end end html = Html.new str1 = gets # safe for nil str2 = gets # safe for nil html.clean(str1) # safe for Html # html.clean(str2) # safe for Html html.foo(str1, str2) ----- END ----- END ----- END ----- END ----- END ----- END ----- str2が洗浄漏れのため,fooメソッドを実行するとソフトウェア割り込みが発 生します. ただ,ここには議論不足の所があり, > def foo(str, opts={}) # 引数が複数 で指摘されているように,配列やハッシュなどのオブジェクトを引数とした時 の対応が十分練れていません.現在の状態ですと,配列等のオブジェクト自身 は,受け取るオブジェクトに対して「安全マーク」を付けることが出来ますが, そこに内包するオブジェクトまで「安全マーク」を付けません.そのため, 「安全マーク」が付けられた配列などから要素を取り出して,gate_private等 に定義したメソッドをその要素を引数として呼び出すと,その要素は洗浄して いないために,ソフトウェア割り込みが発生してしまいます. ただし,あらかじめ洗浄すべきデータが配列等と特定できる場合は,配列等の 要素一つ一つに対して,自身のオブジェクトのcleanメソッドを呼び出せば, 配列等のオブジェクト自身も,要素として内包するオブジェクトも洗浄するこ とは可能です. > * 複数のメソッドがあり、それぞれが異なるタイプの洗浄を > 必要とする場合はどうなりますか。 元々,上記のような考えがありません.htmlを扱うオブジェクトとSQLを扱う オブジェクトは違うものとしています.これは,htmlオブジェクトとSQLオブ ジェクトの両方に安全である洗浄をするのは困難だろうと予想したためです. このような場合は,htmlオブジェクトとSQLオブジェクトの両方を作成して頂 き,互いのcleanメソッドを呼びながら,データを交換することを想定してい ます. > * パッチを適用した Ruby と、適用してない Ruby とで、 > コードを共通化する仕組みは用意されてますか。 今のところ予定していません.ここではクラス作成者とクラス利用者のプレイ ヤーを想定しており,クラス利用者が勝手にセキュリティ制御を外せないよう にすることを考えているためです. とは言うものの,クラス作成者がいろいろテストしたい場面も有るでしょう. スイッチを一つ設けて,gate_publicはpublicに,gate_protectedはprotected に,gate_praivateはprivateに置き換えるようにすることは簡単に出来ると思 います.また,エディタで単にgate_を空列に置き換えても同じことになるで しょう. > * この方法を利用して作られたサンプルアプリケーションは > ありますか。またもしあるとして、それは公開されてますか。 すみません.何か提供するべきとは思っていますが,まだ何もありません.あ まり大きくない例題がありましたらご教授頂けると幸いです. -- Kiyotaka ATSUMI, Suzuka National College of Technology Web: https://www.ka-lab.jp/ PGP Public Key: https://www.ka-lab.jp/pubkey/kiyotaka-at-ka-lab.jp.asc Finger Print: 9E2A 80B4 0F3D 424E 035F B594 991F 7795 DD6D 560F