在我正在處理的專案之一中,我們使用 backtip 方法來運行系統命令。
resp = `7z x #{zip_file_path} -p#{password} -o#{output_path}`
這作業正常。但由于它可能導致命令注入漏洞,我們計劃使用exec或open3。隨著open3我們在執行系統命令面臨的問題。我們提到這個來解決命令注入。
stdin, stdout, stderr = Open3.popen3("7z", "x", zip_file_path, "-p", password, "-o", output_path)
但這會導致以下錯誤
error = stderr.readlines
# ["\n", "\n", "Command Line Error:\n", "Too short switch:\n", "-o\n"]
當我包含這樣的引數時,這會起作用。
stdin, stdout, stderr = Open3.popen3("7z", "x", zip_file_path, "-p#{password}", "-o#{output_path}")
但是我們不應該單獨傳遞引數以避免命令注入嗎?或者我對第一個版本做錯了什么?
uj5u.com熱心網友回復:
您的第二個版本(有效的版本):
stdin, stdout, stderr = Open3.popen3("7z", "x", zip_file_path, "-p#{password}", "-o#{output_path}")
是完全安全的。有沒有參與殼所以沒有什么會解釋password及output_path其他比7z本身。
不幸的是7z,決議開關的方式很奇怪。通常,您希望通過 say 將引數傳遞給開關,-p xyz并且-pxyz將是-p -x -y -z. 當你說:
Open3.popen3("7z", "x", zip_file_path, "-p", password, "-o", output_path)
這就像在 shell 中這樣說:
7z x zip_file_path -p password -o output_path
但7z不喜歡那些空間,它想要:
7z x zip_file_path -ppassword -ooutput_path
所以你被困在做一些字串插值。即便如此,也沒有涉及外殼,Open3因此沒有注入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/380423.html
