char * s fort> = "bonjour"; // suppose qu'il est dynamiquement attribué correctement p>
Je veux utiliser S dans la déclaration ci-dessous lorsque S serait traité comme une chaîne avec la valeur "Bonjour". p>
système ("grep s fort> SearchText.txt> résultat.txt"); p>
Comment puis-je faire cela? P>
3 Réponses :
dans la plaine C, vous utilisez traditionnellement snprintf () pour formater votre chaîne de ligne de commande dans un tampon: bien sûr, pour des raisons de sécurité, vous ne devez jamais faire cela si s code> provient d'une source externe telle qu'un fichier, une base de données ou l'utilisateur lui-même. Cela pourrait conduire à Injection de code shell . P> p>
Ce code est très mauvais et soumis à une vulnérabilité classique. Considérez ce qui se passe lorsque la chaîne s code> est
"'; rm -rf /'" code>
@Eternal apprenant, vous voudrez peut-être écouter @r .. bien que sa réponse soit plus compliquée, il a raison dans le cas général :)
Bien que pas aussi sévère que l'injection de code, cela échoue également lorsque S est> ~ 1000 caractères. SNPRINTF () CODE> Peut empêcher les débordements de la mémoire tampon, mais peut alors vous laisser des vulnérabilités en fonction de la troncature de chaîne.
En général, c'est une très très mauvaise idée d'utiliser Si vous insistez sur l'utilisation de Ce code célibataire-cite la chaîne totale Une meilleure alternative serait d'abandonner le système code> entièrement et effectuer votre propre système code> comme ceci.
système code> exécute la commande via la coquille em>, ce qui signifie que la chaîne que vous passez à
système code> est soumise à la totalité de la totalité de l'expansion de la variable de la coque, l'expansion de la commande, Interprétation spéciale des caractères, etc.
System CODE>, vous devez STRUT> DO STRY> PREMIER SANITIZEZ votre chaîne. Le moyen le plus simple de faire est le suivant: p>
s code> et remplace toutes les citations simples intégrées avec
'\' ' code>. Notez que j'ai également vérifié la troncature de la ligne de commande au cas où elle pourrait conduire à une exécution de commandes dangereuses. P>
Fourchette code> et
EXEC code> pour contourner la coque. Ensuite, il n'y a pas de ligne de commande à interpréter; Vous avez le contrôle total sur les arguments (
* argv [] code> tableau) qui sont transmis au programme externe. p> p>
Plus si la chaîne est un paramètre "Grep" (ou une commande similaire), il vaut la peine d'ajouter "-" comme paramètre avant la chaîne, pour arrêter la chaîne d'être interprétée comme une option Grep s'il arrive de commencer par un " - ".
Eh bien il y a une primitive système - Execl, Execp.
Donc, vous pouvez faire ce exécutant ("ls", "-la", null) code> dans MAIN. P>
Vous voudrez probablement FORK CODE> D'abord, à moins que votre programme ait fini de faire tout ce qu'il veut faire.
C'est
const char * = "bonjour"; code>