使用Ruby中的%x []安全地传递shell命令参数

时间:2011-08-23 06:37:00

标签: ruby security shell

假设我有一个Rails控制器:

dir = params[:dir]
output = %x[ls #{dir}]

如果有人发帖dir="foo; rm -rf /"

,这是一个巨大的安全漏洞

所以我需要保护参数。我知道我能做到

system "ls", dir

但是这种方法不能捕获stdout!

那么,如何安全地将参数传递给%x []?

2 个答案:

答案 0 :(得分:3)

问题是%x()基本上将一个字符串交给要解析的shell,因此你必须逃避shell可能解释的所有内容。所以%x如果你需要处理你自己没有构建的任何东西(事件那么它是可疑的),那么out, err, status = Open3.capture3('/bin/ls', dir) 就差不多了。

一种解决方案是使用Open3.capture3

out

然后根据需要处理标准输出(err)和标准错误({{1}})。 Open3中还有一些可能更好地满足您需求的东西。

答案 1 :(得分:1)

您是否看过Ruby的安全级别?

http://www.ruby-doc.org/docs/ProgrammingRuby/html/taint.html

对于级别> = 2,它表示“无法更改,制作或删除目录,或使用chroot。”

还有一个沙箱宝石,但我不确定它是否仍然有效。您还可以查看“试用Ruby!”的来源。那里必须有某种沙盒。