我需要從服務器應用程序調用wget
,部分url由用戶控制。如果我存儲的參數在服務器應用程序中使用setenv()
環境變量URL
,那麼在派生shell執行通過環境變量傳遞參數,它是完全安全的嗎?
wget somehost/"$URL"
可我認爲$URL
不以任何方式擴大了,它是完全解釋爲一部分網址?這與Bourne shell是否兼容(例如在Ubuntu中爲sh
而不是bash
)?
我需要從服務器應用程序調用wget
,部分url由用戶控制。如果我存儲的參數在服務器應用程序中使用setenv()
環境變量URL
,那麼在派生shell執行通過環境變量傳遞參數,它是完全安全的嗎?
wget somehost/"$URL"
可我認爲$URL
不以任何方式擴大了,它是完全解釋爲一部分網址?這與Bourne shell是否兼容(例如在Ubuntu中爲sh
而不是bash
)?
在調用(forks/execs)wget
命令之前,shell將執行$URL
的參數擴展。既然你有雙引號中的參數,就不會執行分詞,而且「somehost /任何URL擴展爲」將成爲一個參數。
結果可能會在ps(1)
輸出中作爲命令加參數顯示給其他用戶。
此外,如果系統上的ps(1)
實施支持-e
以顯示環境(例如FreeBSD),則可以看到存儲在環境變量中的數據。
如果您的問題是,您是否可以隱藏敏感信息,如訪問憑據這種方式,答案一般是「不」。
我只關注命令注入,所以如果我理解正確,那很好。 –
如何從服務器應用程序運行wget?使用'system()'? – Jens
雙引號變量不應該被任何兼容POSIX的shell擴展或解釋。 – PSkocik
可能的問題:1.如果衍生出來的shell源代碼爲'.bashrc',那麼它將拾取那裏存在的URL。 2.如果你用不同的'URL'生成多個進程,其中一些可能會拾取錯誤的URL。 – alvits