Utilisation de variables dans la fonction system() en c++
string line;
ifstream myfile ("aaa.txt");
getline (myfile,line);
system("curl.exe -b cookie.txt -d test="+line+" http://example.com");
Et Il ne fonctionne pas! J'ai aussi essayé de ligne.c_str(); Mais ça n'a pas fonctionné non plus. S'il vous plaît aider moi.
Downvoted parce que passer des variables à
system()
est activement dangereux. Utilisation spawn()
sur Win32, fork()/exec()
ou posix_spawn()
sur *nix.OriginalL'auteur martin | 2011-02-05
Vous devez vous connecter pour publier un commentaire.
Il ne fonctionne pas parce que vous êtes de passage d'une chaîne C++ à C de la fonction system(). c_str() peut aider, mais vous devez l'appliquer à l'ensemble de la chaîne:
Comme indiqué dans les commentaires ci-dessous, en passant des variables aléatoires à system() peut être très dangereuse, de sorte que vous ne devriez le faire que si vous savez exactement ce qu'il peut contenir. Si il est fourni par l'utilisateur ou reçu depuis le réseau, vous ne devriez pas le faire. Passer la chaîne à travers une sorte de "s'échapper" de la fonction ou de l'utilisation de spawn()/exec()/de tout ce qui ne passe pas à la coquille.
int system(std::string const& s) { return s.c_str(); }
de surcharge.vouliez-vous dire
int system(std::string const& s) {return system(s.c_str());}
? Oui, ça ressemble à une bonne idée.Visiblement oui 😉
-1: dangereux conseils
la question était de savoir comment pour utiliser des variables dans un tel appel, pas de savoir si c'est dangereux ou pas. En fait, les sinus, le gars lit la variable à partir d'un fichier, et non pas directement à partir de l'utilisateur ou d'un réseau, il n'est pas nécessairement dangereux. Cela dépend d'où il a obtenu ce fichier. Si c'est un fichier temporaire généré par la même application et il n'est pas accessible de l'extérieur, je suppose que c'est la fin. Même si je suis d'accord que je devrais avoir mentionné les dangers possibles.
OriginalL'auteur Sergei Tachenov
Problème 1:
Votre problème vient du fait que
system
est de la signature:Ce que vous avez est de type
std::string
.Un moyen de résoudre ce problème est de construire une nouvelle
std::string
puis obtenir le char pointeur à l'aide dec_str()
.Passer ensuite le contenu de
system
.Problème 2:
De la lecture des données et de les transmettre non validées et impure pour
system
va permettre à quiconque d'utiliser votre programme pour exécuter des commandes à la coquille.C'est un risque pour la sécurité.
system
licences d'accès client la même chose que de taper la commande cmd.exe?Ouais, et si vous avez passé
foo & fire_nukes.exe & REM
à son programme, il irait curl.exe ensuite, essayez de l'exécuter fire_nukes.exe. Il serait légèrement différente sur *nix, mais l'idée est la même.OriginalL'auteur Skurmedel
Construire la chaîne que vous êtes de passage à
system()
avec un stringstream!Donc, nous savons que l'utilisation de
system()
est dangereux si vous laissez arbitraire la saisie de l'utilisateur. Cela ne change pas le fait que l'OP voulait assemblée d'entrée à partir d'un fichier. Que faire si le fichier est protégé contre l'accès de l'utilisateur? Que faire si il les lit à partir d'une base de données ou quelque chose? Nous ne savons pas et nous n'avons pas de soins, la sécurité est une partie de l'OP de la responsabilité. Ce n'est pas une raison pour un downvote. Je pouvais enlever lasystem()
d'appel et de ne montrer de la chaîne de montage. Que faire maintenant?vous pourriez dire que l'OP à utiliser une API où chaque argument est séparé, et ne pas utiliser une sous-shell pour analyser la ligne de commande.
OriginalL'auteur Xeo