2009-08-18 7 views
10

J'essaye d'obtenir exec travaillant sur un serveur de Windows et recevant le message d'erreur "incapable de bifurquer". Après avoir passé en revue le problème un peu, il semble que la solution recommandée est de donner les autorisations READ et EXECUTE au compte IUSR à c: \ Windows \ System32 \ cmd.exe.PHP exec est-il sécurisé?

Mais cela a été un trou de sécurité majeur non? Est-ce sûr? Existe-t-il un autre moyen d'exécuter [depuis php] un exe résidant sur le serveur?

Répondre

14

Il doit exécuter cmd.exe parce que lorsque Windows PHP voit ceci:

exec("foo -bar -baz"); 

Il appelle ceci:

cmd /c foo -bar -baz 

Il est seulement un trou de sécurité si vous laissez entrer vos utilisateurs paramètres. À savoir, vous ne devriez pas faire:

// DO NOT DO THIS! 
exec("foo -bar=" . $_GET['bar']); 

Au lieu de cela, vous devez désinfectez vos paramètres avec escapeshellarg.

// This is okay. (Be sure foo.exe can handle unexpected input!) 
exec("foo -bar=" . escapeshellarg($_GET['bar'])); 
+4

La fonction exec est aussi sûre que vous le faites. Tant que vous utilisez les fonctions d'échappement appropriées comme indiqué ici, vous serez bon. –

+1

Bien qu'il soit possible de sécuriser les commandes de script, un vecteur d'attaque commun consiste à télécharger un script malveillant et à utiliser les fonctions exec et similaires pour pirater le serveur. En tant que tel, de nombreux environnements d'hébergement partagés désactivent cette fonction et toute autre fonction pouvant exécuter un argument shell. – Machavity

1

Une chose que vous devez garder à l'esprit est que la création d'un processus sous Windows entraîne plus de frais généraux que que sur les systèmes d'exploitation Unix classe. Si vous avez un grand nombre d'utilisateurs, l'appel répété exec() pourrait ralentir le serveur. Si vous prévoyez une lourde charge sur votre serveur, vous pouvez envisager d'avoir un processus de travail en cours en tant que Windows service

+0

Le même problème peut survenir sous Windows et Linux. – Brad