首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby中具有constantize的远程代码执行

ruby中具有constantize的远程代码执行
EN

Stack Overflow用户
提问于 2013-08-27 12:33:26
回答 1查看 2.3K关注 0票数 9

当使用contantize时,我正试图了解ruby/rails中的远程代码执行漏洞。

我知道能够为服务器提供任何类名可能是潜在的危险,但我想知道这本身是否危险。

例如,如果rails控制器代码如下所示(即对实例化对象执行硬编码方法):

代码语言:javascript
复制
klass = params[:class].classify.constantize
klass.do_something_with_id(params[:id]) if klass.respond_to?('do_something_with_id')

这个代码易受攻击吗?还是只结合能够指定要在类上调用的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-27 12:56:04

将字符串转换为常量本身并不危险,但如何使用该常量是潜在的危险(即随后调用的方法)。

如果您确实需要这样做,那么最好提供一个允许的类列表。例如。

代码语言:javascript
复制
klass = params[:class].classify
if %w(Class1 Class2 Class3).include? klass
  klass.constantize.do_something_with_id(params[:id])
else
  raise 'Forbidden'
end

不管它做了什么,它帮助你在晚上睡觉,知道输入是相当有限的。

更新

另一种控制创建的方法是使用case语句,它更显式,但也更详细:

代码语言:javascript
复制
def create_klass(option)
  case option
  when "option1"
    Class1
  when "option2"
    Class2
  when "option3"
    Class3
  else
    raise "Unknown option"
  end
end

这样,您就不需要向客户端公开系统的内部结构。如果有许多选项,则可以使用带有选项映射到类的散列。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18465564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档