2014-05-22 156 views
1

我有一個小應用程序,它通過執行一個進程來處理http請求,併爲用戶提供的查詢字符串提供一些輸入。我想知道什麼是過濾遠程執行輸入的最佳方法。 PHP的替代,例如會是這樣的: http://php.net/manual/en/function.escapeshellarg.php使用Golang安全地執行命令(避免遠程執行)

眼下的輸入應該是一個有效的URL,如果這使得它更容易,但非常一般的過濾器將是首選。

+1

如果您使用[os/exec](http://golang.org/pkg/os/exec/),則不會將它傳遞到shell,因此不需要執行shell轉義。你應該非常仔細地驗證輸入! –

+0

是的,使用os.exec,不知道它沒有通過它很好的知道它的殼。但即使它不是像「command &&惡意」應該工作的例子? – Feras

+1

本質上,PHP通過將進程執行卸載到shell(甚至不保證爲sh兼容的shell)並使您完成安全工作而得到錯誤。幾乎所有其他語言的os庫都直接調用內核,因此可以隱式避免注入攻擊。 – krait

回答

4

通常這樣的魔法功能很難正確使用,如果您嚴重依賴它們,它們通常會讓您的應用程序面臨攻擊。

我建議您使用智能URL /請求方案來獲取運行所需的命令,並在用戶請求和shell執行之間放置一定級別的解釋,以免由用戶直接使用參數。

您可以獲得包含?verbose=true的請求,並在命令行上將它們轉換爲-v,例如。當處理像字符串這樣的用戶輸入時,需要直接給正在運行的命令,你需要用引號做簡單的轉義(用一個簡單的檢查來查看輸入是否包含引號),以確保你不會遇到「Bobby表「的問題。

另一種方法是通過管道或文件讓程序和底層命令交換數據。這將減少離開命令輸入的開放攻擊向量的可能性。

+0

我已經在做你建議的第一部分了,問題在於第二個參數是使用該命令提供給該命令的URL你認爲使用雙引號對URL進行編碼並且使用雙引號括起來是足夠安全的。再次,這不是關鍵任務,但我寧願沒有這樣的巨大洞穴。 – Feras

+0

這應該足夠了。 – mbanzon

+0

(並且寫出真正的,非常好的測試) – elithrar