概要
Object#tainted? -> bool
詳細
オブジェクトの「汚染マーク」がセットされている時真を返却。
オブジェクトの「汚染マーク」は、組み込み機能利用時に内部で設定される場合と、
自分で Object#taint / untaint メソッドで設定する場合がある。
セキュリティレベルについては下記参照。
http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fsafelevel.html
サンプルコード
require 'tbpgr_utils' name = ARGV[0] age = ARGV[1] Person = Struct.new(:name, :age) tanaka = Person.new('tanaka', 24) yogore = Person.new(name, age) bulk_puts_eval binding, <<-EOS tanaka.name.tainted? tanaka.name.taint tanaka.name.tainted? tanaka.name.untaint tanaka.name.tainted? yogore.name.tainted? yogore.name.taint EOS $SAFE = 1 # 汚染された文字列でディレクトリ操作をしようとしてセキュリティエラーが発生 Dir.mkdir(yogore.name) unless Dir.exist?(yogore.name) __END__ 下記はTbpgrUtils gemの機能 bulk_puts_eval https://rubygems.org/gems/tbpgr_utils https://github.com/tbpgr/tbpgr_utils
出力
$ruby object_tainted.rb tanaka object_tainted.rb:22:in `exist?': Insecure operation: -r (SecurityError) from object_tainted.rb:22:in `<main>' tanaka.name.tainted? # => false tanaka.name.taint # => "tanaka" tanaka.name.tainted? # => true tanaka.name.untaint # => "tanaka" tanaka.name.tainted? # => false yogore.name.tainted? # => true yogore.name.taint # => "tanaka"