1

我需要從服務器應用程序調用wget,部分url由用戶控制。如果我存儲的參數在服務器應用程序中使用setenv()環境變量URL,那麼在派生shell執行通過環境變量傳遞參數,它是完全安全的嗎?

wget somehost/"$URL" 

可我認爲$URL不以任何方式擴大了,它是完全解釋爲一部分網址?這與Bourne shell是否兼容(例如在Ubuntu中爲sh而不是bash)?

+0

如何從服務器應用程序運行wget?使用'system()'? – Jens

+0

雙引號變量不應該被任何兼容POSIX的shell擴展或解釋。 – PSkocik

+0

可能的問題:1.如果衍生出來的shell源代碼爲'.bashrc',那麼它將拾取那裏存在的URL。 2.如果你用不同的'URL'生成多個進程,其中一些可能會拾取錯誤的URL。 – alvits

回答

0

在調用(forks/execs)wget命令之前,shell將執行$URL的參數擴展。既然你有雙引號中的參數,就不會執行分詞,而且「somehost /任何URL擴展爲」將成爲一個參數。

結果可能會在ps(1)輸出中作爲命令加參數顯示給其他用戶。

此外,如果系統上的ps(1)實施支持-e以顯示環境(例如FreeBSD),則可以看到存儲在環境變量中的數據。

如果您的問題是,您是否可以隱藏敏感信息,如訪問憑據這種方式,答案一般是「不」。

+0

我只關注命令注入,所以如果我理解正確,那很好。 –