module Procemon::ObjectEXT # safe_eval(string [, binding [, filename [,lineno]]] *allowed_class/module_names ) -> obj # # Definition of the safe levels # # $SAFE >= 1 # # The environment variables RUBYLIB and RUBYOPT are not processed, and the current directory is not added to the path. # The command-line options -e, -i, -I, -r, -s, -S, and -x are not allowed. # Can't start processes from $PATH if any directory in it is world-writable. # Can't manipulate or chroot to a directory whose name is a tainted string. # Can't glob tainted strings. # Can't eval tainted strings. # Can't load or require a file whose name is a tainted string. # Can't manipulate or query the status of a file or pipe whose name is a tainted string. # Can't execute a system command or exec a program from a tainted string. # Can't pass trap a tainted string. # # $SAFE >= 2 # # Can't change, make, or remove directories, or use chroot. # Can't load a file from a world-writable directory. # Can't load a file from a tainted filename starting with ~. # Can't use File#chmod , File#chown , File#lstat , File.stat , File#truncate , File.umask , File#flock , IO#ioctl , IO#stat , Kernel#fork , Kernel#syscall , Kernel#trap . Process::setpgid , Process::setsid , Process::setpriority , or Process::egid= . # Can't handle signals using trap. # # $SAFE >= 3 # # All objects are created tainted. # Can't untaint objects. # # # Evaluates the Ruby expression(s) in string. If # binding is given, which must be a Binding # object, the evaluation is performed in its context. If the # optional filename and lineno parameters are # present, they will be used when reporting syntax errors. # # def get_binding(str) # return binding # end # str = "hello" # safe_eval "str + ' Fred'" ,Kernel #=> "hello Fred" # safe_eval "str + ' Fred'", get_binding("bye") ,Kernel #=> "bye Fred" def safe_eval(*args) # require 'stringio' # old_values = [$stderr,$VERBOSE] # $stderr = StringIO.new # $VERBOSE= false ::Thread.new{ safe_ok= false begin $SAFE= 3 safe_ok= true rescue end if safe_ok eval(*args) end }.value # ensure # $stderr = old_values[0] # $VERBOSE= old_values[1] end end Object.__send__ :include, Procemon::ObjectEXT