从单声道下的asp.net mvc app安全地运行linux命令行应用程序

时间:2011-11-05 19:55:44

标签: asp.net-mvc linux shell command-line mono

我们有一个内部和外部的asp.net mvc应用程序在ubuntu 10.04 LTS上的mono下运行。用户在同一服务器上使用的还有一个复杂的(本机的,非单声道的)命令行应用程序。他们通过ssh登录来执行此操作。我们对ssh用户的安全性非常严格,因此除了运行命令行应用程序之外,他们不能做很多事情。

这些应用的用户必须:

  1. 通过ssh登录到服务器,运行命令行应用程序,使用任何命令行开关,然后执行一些长时间运行的处理,并将报告放在Web应用程序的数据库中。
  2. 登录网络应用,然后设置一些通过网络应用发布报告的选项。
  3. 应用的用户希望跳过第1步并在网络应用中完成所有操作。我正在考虑创建一个定期轮询数据库以运行命令行应用程序作业的服务。用户可以根据需要在Web应用程序中创建作业。

    问题是,用户想要一个Web应用程序中的框,他们可以在其中填写任何命令行选项。但我不希望他们做这样的事情:

    -a dothis -b dothis & rm importantfile.txt

    ...如果用户对Web应用程序的凭据有所妥协。我想确保只使用该命令行应用程序,而不是其他任何东西。我正在考虑阻止允许使用字符! | < > & / \ $ ( ),这看起来像命令行应用程序不需要。

    这够好吗?还有其他我应该知道的shell技巧吗?我应该采取不同的方法吗?

    我真的不想为用户提供的参数编写某种解析器,因为用户喜欢使用大量的解析器。

1 个答案:

答案 0 :(得分:4)

  1. 您可以将程序本身作为新进程启动,而不是将命令行作为shell命令运行(启动shell以启动程序)吗?我相信这就是答案:Execute a command line utility in ASP.NET。如果实际的程序是作为一个进程启动的,而不是一个shell,那么像&amp;或者rm只是命令行实用程序的参数,如果命令行实用程序检查错误的输入,这应该没问题。

  2. 如果这不可行(虽然它可能是更好的选择),用单引号转义序列替换所有单引号,然后在每个参数周围放置单引号(用空格分隔字符串作为分隔符),可以提供类似的效果。而不是确保你避免所有可能的坏字符(;可以类似地和许多shell中使用),你只需要确保提供的参数不能从单引号中转义。 (您可能还希望事先检查单引号包围的参数,以避免双引用它们,并且在拆分参数等时不要使用转义空格,以便用户可以提供需要空格的参数。)