gin*_*ime 8 ruby security ruby-on-rails
我正在尝试contantize使用ruby/rails中的远程代码执行漏洞.
我知道能够为服务器提供任何类名可能是有潜在危险的,但我想知道这本身是否危险.
例如,如果rails控制器代码看起来像这样(即在实例化对象上执行硬编码方法):
klass = params[:class].classify.constantize
klass.do_something_with_id(params[:id]) if klass.respond_to?('do_something_with_id')
Run Code Online (Sandbox Code Playgroud)
这段代码容易受到攻击 或者只是结合能够同时指定要在类上调用的方法?
将字符串转换为常量本身并不危险,但是如何使用该常量是有潜在危险的(即随后调用的方法).
如果你真的需要这样做,那么最好提供一个允许的类列表.例如
klass = params[:class].classify
if %w(Class1 Class2 Class3).include? klass
klass.constantize.do_something_with_id(params[:id])
else
raise 'Forbidden'
end
Run Code Online (Sandbox Code Playgroud)
无论如何,它可以帮助您在晚上睡觉,知道输入相当有限.
另一种控制创建的方法是使用case语句:更明确但更冗长.
def create_klass(option)
case option
when "option1"
Class1
when "option2"
Class2
when "option3"
Class3
else
raise "Unknown option"
end
end
Run Code Online (Sandbox Code Playgroud)
这样,您就不需要将系统的内部暴露给客户端.如果有很多选项,那么您可以使用带有选项映射到类的哈希.
| 归档时间: |
|
| 查看次数: |
1290 次 |
| 最近记录: |