Quelle est la différence entre escapeshellarg et escapeshellcmd?
PHP a 2 aux fonctions connexes, escapeshellarg()
et escapeshellcmd()
. Ils semblent tous deux à faire la même chose, à savoir d'aider à faire une chaîne de plus sûr à utiliser dans system()
/exec()
/etc.
Qui dois-je utiliser? Je veux juste être en mesure de prendre une entrée de l'utilisateur et exécuter une commande sur elle, et ne pas avoir à tout faire sauter. Si PHP a un exec-type de la fonction qui a eu un tableau de chaînes de caractères (comme argv), qui contourne la coquille, je voudrais l'utiliser. Semblable à Python sous-processus.call()
fonction.
Vous devez vous connecter pour publier un commentaire.
De http://ie2.php.net/manual/en/function.escapeshellarg.php
escapeshellarg, comme son nom l'indique, est utilisé comme passage shell argument(s). Par exemple, vous souhaitez ajouter à la liste du répertoire courant,
À la fois faire des choses similaires et dépend simplement de la façon dont vous gérer votre logique, faire assurez-vous que votre normaliser et de valider votre entrée avant de passer directement à ces méthodes pour une meilleure sécurité.
Généralement, vous aurez envie d'utiliser
escapeshellarg
, faire un seul argument d'une commande shell coffre-fort. Voici pourquoi:Supposons que vous avez besoin pour obtenir une liste de fichiers dans un répertoire. Vous venez de la façon suivante:
(C'est une mauvaise façon de le faire, mais à des fins d'illustration de l'ours avec moi)
Cela fonctionne "grand" pour ce chemin, mais supposons que le chemin était quelque chose de plus dangereux:
Parce que le chemin donné a été utilisé unsanitised, toute commande peut éventuellement être exécuté. Nous pouvons utiliser la
escapeshell*
méthodes pour essayer d'éviter cela.D'abord, à l'aide de
escapeshellcmd
:Cette méthode s'échappe uniquement des caractères qui pourraient conduire à l'exécution de plusieurs commandes, bien qu'il arrête le risque de sécurité majeur, elle peut encore conduire à de multiples paramètres passés dans l'.
Maintenant, à l'aide de
escapeshellarg
:Qui nous donne le résultat que nous voulons. Vous remarquerez qu'il est cité l'ensemble de l'argument, de sorte que les espaces individuels, etc, n'ont pas besoin d'être échappé. Si l'argument était d'avoir des devis, ils pourraient être cités.
Pour résumer,
escapeshellcmd
permet de s'assurer une chaîne de caractères est une seule commande, tandis queescapeshellarg
rend une chaîne de sécurité pour l'utiliser comme un simple argument d'une commande.Le PHP docs préciser la différence:
escapeshellcmd:
escapeshellarg:
Source:
http://www.php.net/manual/en/function.escapeshellcmd.php
http://www.php.net/manual/en/function.escapeshellarg.php
Une solution simple pour déterminer la différence entre deux sonorité similaire fonctions de PHP est d'écrire un petit script en ligne de commande en PHP qui génère l'ensemble de la possible espace de recherche et de montrer les différences (dans ce cas, la comparaison de 256 valeurs):
L'exécution de la ci-dessus en vertu de PHP 5.6 sur l'Invite de Commande Windows sorties:
Exécutant le même script en PHP 5.5 pour Linux sorties:
La principale différence est que PHP escapeshellcmd() sous Windows préfixes de caractères avec un accent circonflexe ^ au lieu d'une barre oblique inverse \. Les bizarreries sous Linux à partir d'chr(128) par chr(255) pour les deux escapeshellcmd() et escapeshellarg() peut être expliqué par l'utilisation de l'UTF-8 non valide code de points de chute, tronquées ou mal interprété.
Il est également à noter que escapeshellarg() échappe à beaucoup moins de personnages et toujours fait le travail.
En termes de l'ensemble du système et des applications de sûreté et de sécurité, vous êtes mieux d'utiliser escapeshellarg() et individuellement échapper à chaque argument qui consiste en la saisie de l'utilisateur.
Un dernier exemple:
Windows sorties:
Linux sorties:
PHP escapeshellarg() sur Windows entoure la chaîne avec le guillemet double "caractère alors que Linux utilise les apostrophes' caractère. PHP sur Windows remplace complètement l'intérieur des guillemets avec des espaces (qui pourrait être un problème dans certains cas). PHP sur Linux va un peu sortir de son chemin pour échapper à des simples guillemets et le caractère \ est échappé \\ sous Windows. PHP escapeshellarg() sur Windows remplace aussi ! et % des caractères avec des espaces. Toutes les plates-formes de remplacer \0 avec des espaces.
Noter que le comportement n'est pas nécessairement compatibles entre les versions de PHP et de la documentation PHP, ne reflète pas toujours la réalité. La rédaction d'un rapide de script ou de la lecture du code source de PHP sont deux façons de comprendre ce qui se passe derrière les coulisses.