Du manuel de findutils:
Par exemple, des constructions telles que ces deux commandes
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;sont très dangereux. La raison en est que le '{}' est développé en un nom de fichier qui peut contenir un point-virgule ou d'autres caractères spéciaux pour le shell. Si par exemple quelqu'un crée le fichier,
/tmp/foo; rm -rf $HOMEles deux commandes ci-dessus pourraient supprimer le répertoire personnel de quelqu'un.Donc, pour cette raison, n'exécutez aucune commande qui transmettra des données non fiables (telles que les noms de fichiers) à des commandes qui interprètent des arguments comme des commandes à interpréter davantage (par exemple «sh»).
Dans le cas du shell, il existe une solution de contournement intelligente pour ce problème:
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;Cette approche n'est pas garantie pour éviter tous les problèmes, mais elle est beaucoup plus sûre que de remplacer les données du choix d'un attaquant dans le texte d'une commande shell.
- La cause du problème est-elle
find -exec sh -c "something {}" \;{}est-il dû que le remplacement de est sans guillemets et n'est donc pas traité comme une chaîne unique? Dans la solution
find -exec sh -c 'something "$@"' sh {} \;,le premier
{}est remplacé, mais comme il{}n'est pas cité, n'a-t-il pas"$@"également le même problème que la commande d'origine? Par exemple,"$@"sera étendu à"/tmp/foo;","rm","-rf"et"$HOME"?pourquoi n'est-il
{}pas échappé ou cité?
- Pourriez-vous donner d'autres exemples (toujours avec
sh -cou sans celui-ci le cas échéant; avec ou sansfindqui peuvent ne pas être nécessaires) où le même type de problème et de solution s'appliquent, et qui sont des exemples minimaux afin que nous puissions nous concentrer sur le problème et la solution avec peu de distraction possible? Voir Façons de fournir des arguments à une commande exécutée par `bash -c`
Merci.