Kernel#eval()方法,可以直接执行ruby代码字符串
(1)Kernel#binding()方法用来捕获当前作用域返回一个Binding对象,Binding对象表示一个完整的作用域
(2)eval()可以接受两个参数,第一个是代码字符串,第二个是Binding对象,代码会在传入的作用域中执行(*eval()家族都可以)
(3)Ruby还提供了一个名为TOPLEVEL_BINDING的预定义常量,他表示顶级作用域的Binding对象。可以在程序的任何地方访问这个顶级作用域
(4) eval()方法会有两个可选参数file和line,传入文件路径以及当前执行代码行号,用于在在代码异常时,打印出堆栈信息
(5)由于代码字符串和快非常相似,在很多情况下,可以选择使用任意一种,但能用块尽量用块。
(6)eval()方法有代码注入攻击的风险,慎用
(7)污染对象和安全级别:
污染对象包括程序从Web表单、文件盒命令行读入的字符串,甚至包括系统变量,每次从污染字符串运算而来的新字符串,也是被污染的,可以通过调用tainted?()方法判断是不是被污染
ruby安全级别,可以通过修改$SAFE全局标量修改,分为0-4,5个级别
0--完全不受约束,大于0,Ruby会拒绝执行污染的字符串,大于2,会禁止巨大部分文件相关工作
可以通过Object#untaint()方法去除污染