假设我有一个Rails控制器:
dir = params[:dir]
output = %x[ls #{dir}]
如果有人发帖dir="foo; rm -rf /"
所以我需要保护参数。我知道我能做到
system "ls", dir
但是这种方法不能捕获stdout!
那么,如何安全地将参数传递给%x []?
答案 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!”的来源。那里必须有某种沙盒。