2011-11-05 69 views
1

我們有一個面向內部和外部的asp.net mvc應用程序,在ubuntu 10.04 LTS下運行在單聲道下。用戶在同一臺​​服務器上使用的還有一個複雜的(本地,非單聲道)命令行應用程序。他們通過ssh登錄來執行此操作。我們對ssh用戶的安全性非常關注,所以除了運行命令行應用程序外,他們無法完成其他任務。安全運行在asp.net mvc應用程序下的單聲道命令行應用程序

這些應用程序的用戶有:

  1. 通過ssh登錄到服務器,運行與任何命令行參數的要求,然後做一些長期運行的處理,並把在報表中的命令行應用程序數據庫的Web應用程序。
  2. 登錄到Web應用程序,然後設置一些選項以通過Web應用程序發佈報告。

應用程序的用戶想要跳過第1步並在網絡應用程序中執行所有操作。我正在考慮創建一個定期輪詢數據庫以便運行命令行應用程序作業的服務。作業將由用戶根據需要在網絡應用程序中創建。

問題是,用戶需要一個在web應用程序中的框,他們可以在其中填寫任何命令行選項。但我不希望他們做這樣的事情:

-a dothis -b dothis & rm importantfile.txt

...的情況下,用戶的憑據到Web應用程序在某種程度上受到影響。我想確保只有該命令行應用程序可以使用,而不是其他任何東西。我正在考慮阻止字符! | < > &/\ $ ()被允許,這看起來像命令行應用程序不需要。

這夠好嗎?有什麼其他的shell技巧我應該知道嗎?我應該採取不同的方法嗎?

我真的不想爲用戶提供的參數編寫某種解析器,因爲有大量的用戶喜歡使用它們。

回答

4
  1. 而不是運行命令行作爲shell命令(啓動shell來啓動程序),你可以啓動程序本身作爲一個新的過程嗎?我相信這就是這裏的答案:Execute a command line utility in ASP.NET。如果實際程序是作爲一個進程啓動的,而不是一個shell,那麼像&或rm這樣的東西只是命令行實用程序的參數,如果命令行實用程序檢查錯誤的輸入,應該沒問題。

  2. 如果這不可行(儘管它可能是更好的選擇),用單引號轉義序列替換所有單引號,然後在每個參數周圍放置單引號(以空格作爲分隔符分割字符串),可以提供了類似的效果。與其確保您避免所有可能的錯誤字符(在許多shell中可以類似使用&),您只需確保提供的參數不能脫離單引號。 (您可能還想事先檢查包含單引號的參數,以避免對它們進行雙引號引用,並且在分割參數等時不會引用轉義空格,以便用戶可以提供需要空格的參數)。

+0

噢。我現在覺得有點愚蠢:)我可以肯定地啓動它作爲一個過程。我不敢相信我之前沒有想到...... – simon

相關問題