比方說,我在Rails控制器:傳遞外殼牢固命令參數隨%×[]在Ruby中
dir = params[:dir]
output = %x[ls #{dir}]
這是一個巨大的安全漏洞,如果有人崗位dir="foo; rm -rf /"
所以我需要保護參數。我知道我可以做
system "ls", dir
但是這種方法不捕獲標準輸出!
那麼,我該如何安全地將參數傳遞給%x []?
比方說,我在Rails控制器:傳遞外殼牢固命令參數隨%×[]在Ruby中
dir = params[:dir]
output = %x[ls #{dir}]
這是一個巨大的安全漏洞,如果有人崗位dir="foo; rm -rf /"
所以我需要保護參數。我知道我可以做
system "ls", dir
但是這種方法不捕獲標準輸出!
那麼,我該如何安全地將參數傳遞給%x []?
問題是,%x()
基本上將一個字符串交給shell進行解析,所以你不得不轉義shell可能解釋的所有東西。所以%x
幾乎不在窗口,如果你需要處理你自己沒有建立的任何東西(和事件,那麼它是可疑的)。
一種解決方案是使用Open3.capture3:
out, err, status = Open3.capture3('/bin/ls', dir)
,然後用標準的輸出(out
)和標準誤差(err
)根據需要返回處理。 Open3還有一些其他的東西可以更好地滿足您的需求。
你看過Ruby的安全級別嗎?
http://www.ruby-doc.org/docs/ProgrammingRuby/html/taint.html
對於等級> = 2,它說 「無法更改,製作或刪除目錄,或使用的chroot。」
以前也有過沙盒寶石,但我不確定它是否仍然有效。您還可以看看「嘗試Ruby!」的來源。那裏必須有一些沙盒。
這是一個很好的建議,但我更願意找到一個最簡單的方法。畢竟,如果系統可以做到這一點,執行應該也能做到這一點:) – Blacksad
正是我在找什麼,謝謝! – Blacksad