在Ruby中可以插值到字符串数据导致字符串终止?

问题描述 投票:3回答:2

在Ruby中是否有添加到与插补字符串数据可以终止字符串什么办法?例如是这样的:

"This remains#{\somekindofmagic} and this does not" # => "This remains"

我假设没有,但我想,以确保做这样的事情

something.send("#{untrusted_input}=", more_untrusted_input)

实际上并没有留下某种方式,内插的字符串可以被终止,被用来发送EVAL。

ruby string string-interpolation
2个回答
2
投票

不可能AFAIK输入字符串数据。红宝石Strings可以包含任意的二进制数据,应该及早终止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。


2
投票

在红宝石字符串作为在堆上字节数组和保持该字符串的长度的整数。内部处理。因此,虽然在C NUL字节(\0)终止字符串,这不能红宝石发生。

在红宝石字符串内部在此处了解详情:http://patshaughnessy.net/2012/1/4/never-create-ruby-strings-longer-than-23-characters(也包括为什么红宝石字符串长度超过23个字节是在Ruby 1.9的速度较慢)。

© www.soinside.com 2019 - 2024. All rights reserved.