2011-11-05 6 views
1

Nous avons une application mvc asp.net interne et externe face à mono sur Ubuntu 10.04 LTS. Il existe également une application de ligne de commande compliquée (native, non mono) que les utilisateurs utilisent sur le même serveur. Ils se connectent via ssh pour ce faire. Nous avons la sécurité pour les utilisateurs SSH assez verrouillé, donc ils ne peuvent pas faire grand-chose d'autre que d'exécuter l'application en ligne de commande.exécuter en toute sécurité linux ligne de commande app de asp.net mvc app sous mono

Les utilisateurs de ces applications doivent:

  1. connexion via ssh sur le serveur, lancez l'application en ligne de commande avec tout ce que les commutateurs de ligne de commande sont nécessaires, qui fait alors un certain traitement à long en cours d'exécution et met un rapport dans la db de l'application web.
  2. Connectez-vous à l'application Web, puis définissez des options pour la publication d'un rapport via l'application Web.

Les utilisateurs des applications veulent ignorer l'étape 1 et tout faire dans l'application Web. Je pense à la création d'un service qui interroge régulièrement la base de données pour les travaux d'application de ligne de commande à exécuter. Les emplois seraient créés par les utilisateurs comme souhaité dans l'application Web.

Le problème est, les utilisateurs veulent une boîte dans l'application Web où ils peuvent simplement remplir toutes les options de ligne de commande. Mais je ne veux pas qu'ils fassent quelque chose comme ceci:

-a dothis -b dothis & rm importantfile.txt

... dans le cas où les informations d'identification de l'utilisateur à l'application Web sont en quelque sorte compromis. Je veux m'assurer que seule cette application en ligne de commande peut être utilisée et rien d'autre. Je pense à empêcher les caractères ! | < > &/\ $ () d'être autorisés, ce qui semble ne pas être requis par l'application en ligne de commande.

Est-ce suffisant? Y a-t-il d'autres trucs de shell que je devrais connaître? Devrais-je adopter une approche différente? Je ne veux vraiment pas avoir à écrire une sorte d'analyseur pour les arguments fournis par les utilisateurs, car il y en a une tonne que les utilisateurs aiment utiliser.

Répondre

4
  1. Au lieu d'exécuter la ligne de commande comme une commande shell (lancement de la coque pour lancer le programme), vous pouvez lancer le programme lui-même comme un nouveau processus? Je crois que c'est ce que la réponse est en train de faire: Execute a command line utility in ASP.NET. Si le programme réel est lancé en tant que processus, plutôt que comme un shell, alors des choses comme & ou rm ne seront que des arguments pour l'utilitaire de ligne de commande, ce qui devrait aller si l'utilitaire de ligne de commande vérifie les mauvaises entrées. Si cela n'est pas possible (bien que ce soit probablement la meilleure option), remplacer toutes les guillemets simples par des guillemets simples, puis placer des guillemets autour de chacun des arguments (scinder la chaîne avec un espace comme délimiteur), fournir un effet similaire. Au lieu de vous assurer que vous éviterez tous les mauvais caractères possibles (; peut être utilisé de manière similaire à & dans de nombreux shells), vous devez seulement vous assurer que les arguments fournis ne peuvent pas s'échapper des guillemets simples. (Vous pouvez également vérifier au préalable les arguments entourés de guillemets simples, pour éviter les doubles guillemets, et ne pas encercler les espaces échappés lors de la division des arguments, etc., afin que les utilisateurs puissent fournir des arguments nécessitant des espaces).

+0

Oh oui. Je me sens un peu stupide maintenant :) Je peux certainement le lancer comme un processus. Je ne peux pas croire que je n'y ai pas pensé plus tôt ... – simon

Questions connexes