在Ruby中是否有添加到与插补字符串数据可以终止字符串什么办法?例如是这样的:
"This remains#{\somekindofmagic} and this does not" # => "This remains"
我假设没有,但我想,以确保做这样的事情
something.send("#{untrusted_input}=", more_untrusted_input)
实际上并没有留下某种方式,内插的字符串可以被终止,被用来发送EVAL。
不可能AFAIK输入字符串数据。红宝石String
s可以包含任意的二进制数据,应该及早终止String
字节没有神奇的组合。
如果你担心在Ruby字符串“注水”式的攻击,那么这是一般不容易实现的,如果输入的是在已转换为字符串(和你对已经触发不能发生一个eval特别关注外部数据的形式)。这种攻击风格依赖于不正确转义语言构造,通过输入字符串到一些其他的解释(如SQL或JavaScript)的代码。
然而,如果String
参数在从在同一进程中不可信Ruby代码Ruby对象的形式来,有可能的副作用添加到它们:
class BadString
def to_s
puts "Payload"
"I am innocent"
end
end
b = BadString.new
c = "Hello #{b}"
Payload
=> "Hello I am innocent"
编辑:你举的例子
something.send("#{untrusted_input}=", more_untrusted_input)
仍然会担心我咯,如果真的untrusted_input
被信任,你的事实,有没有方法=
结束了,你会不高兴呼吁倚重。有时候,新的方法可以上,由于使用的框架或宝石的核心类定义,你可能不知道他们,或者他们可能会出现在以后的版本中的宝石。我个人白名单允许的方法名称因为这个原因,或使用输入数据的一些其他验证方案,无论你如何安全的感觉对开放式evals。
在红宝石字符串作为在堆上字节数组和保持该字符串的长度的整数。内部处理。因此,虽然在C NUL字节(\0
)终止字符串,这不能红宝石发生。
在红宝石字符串内部在此处了解详情:http://patshaughnessy.net/2012/1/4/never-create-ruby-strings-longer-than-23-characters(也包括为什么红宝石字符串长度超过23个字节是在Ruby 1.9的速度较慢)。