読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

汚染されたクラスの利用

注 (2008-08-28)
最新のRuby(1.8.7-p72)ではメソッド呼び出し制限の動作が修正されています。最新の環境での制限表は、続 汚染されたクラスの利用を参照ください。


汚染されたクラスの利用について、気になっていたことの検証結果をまとめる。

クラスの汚染

セーフレベル3または4でクラスを作成するか、

tainted_calss = Thread.fork {
  $SAFE = 3
  class TaintedClass
    attr :test, true
    self
  end
}.value

クラスのtaintを呼び出すと、クラスを汚染できる。(試した限りではどちらも同じ挙動だった。)

tainted_calss2 = class TaintedClass2
  attr :test, true
  self
end
tainted_calss2.taint

クラス/インスタンスの汚染とメソッドの汚染

クラスが普通 クラスが汚染
インスタンスが普通 メソッドは普通 メソッドは汚染
インスタンスが汚染 メソッドは普通 メソッドは汚染

なお、汚染されたメソッドは、強制的にセーフレベル4で実行されるとのこと(→ Rubyリファレンス セキュリティモデル)

各セーフレベルでのインスタンス/メソッドの汚染によるメソッド呼び出しの制限

  • セーフレベル0では、汚染されたメソッド(=汚染されたクラスのメソッド)を実行できない。
  • セーフレベル4では、汚染されていないインスタンスのsetメソッドを実行できない。
  • もちろん、メソッド内で各セーフレベルで禁止されている行為(ファイルの書き込みなど)を行っている場合はこの限りではないですよ。
セーフレベル0 セーフレベル1-3 セーフレベル4
クラス:汚染/インスタンス:汚染 ×
クラス:通常/インスタンス:汚染
クラス:汚染/インスタンス:通常 × ×(setのみ/getは可)
クラス:通常/インスタンス:通常 ×(setのみ/getは可)

※○..メソッドの実行可, ×..メソッドの実行不可