在Ruby中,有任何方法将数据添加到带插值的字符串中可以终止字符串吗?例如:
"This remains#{\somekindofmagic} and this does not" # => "This remains"
我假设没有,但我想确保做像
这样的事情something.send("#{untrusted_input}=", more_untrusted_input)
实际上并没有留下内插字符串可以终止并用于发送eval的方法。
答案 0 :(得分:2)
输入字符串数据AFAIK不可用。 Ruby String
可以包含任意二进制数据,应该没有早期终止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
真的是不可信的,你是这样的事实,有没有在=
,你会不高兴呼吁结束方法严重依赖。有时,由于使用框架或gem,可以在核心类上定义新方法,您可能不了解它们,或者它们可能出现在gem的更高版本中。我个人会因为这个原因将允许的方法名称列入白名单,或者对传入的数据使用其他一些验证方案,而不管你对开放式的逃避有多安全。
答案 1 :(得分:2)
ruby中的字符串在内部处理为堆上的字节数组和一个保存字符串长度的整数。因此,在C中,NUL字节(\0
)终止一个字符串,这在ruby中不会发生。
有关ruby string internals的更多信息:http://patshaughnessy.net/2012/1/4/never-create-ruby-strings-longer-than-23-characters(还包括为什么ruby 1.9中长度超过23个字节的ruby字符串更慢)。