A partir d'un programme C, je veux appeler un script shell avec un nom de fichier en tant que paramètre. Les utilisateurs peuvent contrôler le nom de fichier. Le C est quelque chose comme (initialisation/vérification d'erreur omis):Existe-t-il un moyen d'empêcher sh/bash d'effectuer une substitution de commande?
sprintf(buf, "/bin/sh script.sh \"%s\"", filename);
system(buf);
Le dispositif cible est en fait un système embarqué donc je ne pas besoin de se soucier des utilisateurs malveillants. Évidemment, ce serait un vecteur d'attaque dans un environnement Web. Cependant, s'il y a un nom de fichier sur le système qui, par exemple, contient des backquotes dans son nom, la commande échouera parce que le shell effectuera une expansion sur le nom. Est-il possible d'empêcher la substitution de commande?
Utilisez des guillemets simples '' 'à la place. Bash ne le remplacera pas. C'est à dire. 'sprintf (buf,"/bin/sh script.sh '% s' ", nom de fichier); Ensuite, tout dépend de ce que fait 'script.sh'. Vous pouvez également spécifier '-r' pour un shell restreint, mais il y a certaines limitations de ce que vous pouvez faire dans un tel shell, voir la section' RESTRICTED SHELL' de la page de manuel bash pour plus de détails. –