2011-08-23 56 views
3

比方說,我在Rails控制器:傳遞外殼牢固命令參數隨%×[]在Ruby中

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

這是一個巨大的安全漏洞,如果有人崗位dir="foo; rm -rf /"

所以我需要保護參數。我知道我可以做

system "ls", dir 

但是這種方法不捕獲標準輸出!

那麼,我該如何安全地將參數傳遞給%x []?

回答

3

問題是,%x()基本上將一個字符串交給shell進行解析,所以你不得不轉義shell可能解釋的所有東西。所以%x幾乎不在窗口,如果你需要處理你自己沒有建立的任何東西(和事件,那麼它是可疑的)。

一種解決方案是使用Open3.capture3

out, err, status = Open3.capture3('/bin/ls', dir) 

,然後用標準的輸出(out)和標準誤差(err)根據需要返回處理。 Open3還有一些其他的東西可以更好地滿足您的需求。

+0

正是我在找什麼,謝謝! – Blacksad

1

你看過Ruby的安全級別嗎?

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

對於等級> = 2,它說 「無法更改,製作或刪除目錄,或使用的chroot。」

以前也有過沙盒寶石,但我不確定它是否仍然有效。您還可以看看「嘗試Ruby!」的來源。那裏必須有一些沙盒。

+0

這是一個很好的建議,但我更願意找到一個最簡單的方法。畢竟,如果系統可以做到這一點,執行應該也能做到這一點:) – Blacksad