OVH Cloud OVH Cloud

empêcher l'enchainement des commandes

2 réponses
Avatar
seb
Salut,

J'ai besoin d'un formulaire qui permet de passer une commande complète pour
imagemagick. Cette commande est récupérée par un script php qui le passe au
système via la fonction exec().

Donc j'ai une sorte de:
exec($_POST['command']);

JE SAIS QUE C'EST MAL !

Je vérifie déjà que le 1er mot de la commande issue du formulaire est bien
le nom d'un des binaires de imagemagick et je lui rajoute le chemin absolu
qui va bien.

Mais comment m'assurer que la commande passée est juste une commande
imagemagick et qu'il n'y a pas de pipe ou autre synthaxe qui permettrait de
passer d'autres commandes ?

Quels sont les opérateurs (genre | ) qui permetteraient d'enchainer d'autres
commandes ?
Quelles sont les synthaxes qui permetteraient d'enchainer d'autres commandes
?
Bref comment parser la commande issue du formulaire en étant sûr de ne rien
oublier ?
Ou alors, existe-t-il une commande particulière qui ne limiterait
l'exécution à la 1ère commande issue du formulaire ?

seb

2 réponses

Avatar
FAb
"seb" writes:

Salut,

J'ai besoin d'un formulaire qui permet de passer une commande complète pour
imagemagick. Cette commande est récupérée par un script php qui le passe au
système via la fonction exec().

Donc j'ai une sorte de:
exec($_POST['command']);

JE SAIS QUE C'EST MAL !


très mal

Je vérifie déjà que le 1er mot de la commande issue du formulaire est bien
le nom d'un des binaires de imagemagick et je lui rajoute le chemin absolu
qui va bien.


Imagemagick c'est très lourd en temps cpu. La lib GD ne suffit-elle pas ?

Mais comment m'assurer que la commande passée est juste une commande
imagemagick et qu'il n'y a pas de pipe ou autre synthaxe qui permettrait de
passer d'autres commandes ?


filtrer.

Quels sont les opérateurs (genre | ) qui permetteraient d'enchainer d'autres
commandes ?
Quelles sont les synthaxes qui permetteraient d'enchainer d'autres commandes
?


`cmd`
$(cmd)
cmd1 & cmd2
cmd1 ; cmd2


Bref comment parser la commande issue du formulaire en étant sûr de ne rien
oublier ?


Hmmm c'est pas gagné !! Tu veux vraiment coder un wrapper pour imagemagick ?

Ou alors, existe-t-il une commande particulière qui ne limiterait
l'exécution à la 1ère commande issue du formulaire ?


Si tu veux vraiment sécuriser l'appel à ImageMagick à part paramétrer fortement
l'appel et filtrer ces paramètres, je ne suis pas sûr.

FAb

Avatar
cedric
seb wrote:

exec($_POST['command']);


C'est quoi l'URL ? ~:-)

Le mieux est encore de ne pas exécuter de shell, en utilisant la
fonction php pcntl_exec plutot qu'exec. Inconvénient, c'est qu'il faut
un PHP récent ( >= 4.2.0 )

Sinon, s'il faut absolument utiliser exec, il y a la fonction
escapeshellcmd. Je ne sais pas si c'est fiable.