Использование переменных в функции system () c ++ - PullRequest
5 голосов
/ 05 февраля 2011

<code>
  string line;
  ifstream myfile ("aaa.txt");
  getline (myfile,line);
  system("curl.exe -b cookie.txt -d test="+line+"  <a href="http://example.com" rel="noreferrer">http://example.com</a>");

И это не работает!Я также попробовал line.c_str ();Но это тоже не сработало.Пожалуйста, помогите мне.

Ответы [ 3 ]

11 голосов
/ 05 февраля 2011

Это не работает, потому что вы передаете строку C ++ в систему функций C ().c_str () может помочь, но вы должны применить ее ко всей строке:

system(("curl.exe -b cookie.txt -d test="+line+"  http://example.com").c_str());

Как отмечено в комментариях ниже, передача случайных переменных в system () может быть довольно опасной, поэтому вы должны это делатьесли вы точно знаете, что он может содержать.Если он предоставлен пользователем или получен из сети, вы, вероятно, не должны этого делать.Передайте строку через какую-нибудь функцию «escape» или используйте spawn () / exec () / все остальное, что не передает ее оболочке.

10 голосов
/ 05 февраля 2011

Задача 1:

Ваша проблема связана с тем, что system имеет подпись:

int system (const char *command);

То, что у вас есть, имеет тип std::string.

Один из способов исправить это - создать новый std::string, а затем получить указатель на символ, используя c_str().

string cmd("curl.exe -b cookie.txt -d test=");
cmd += line;
cmd += "  http://example.com";

Затем передать содержимое на system.

system(cmd.c_str());

Проблема 2:

Считывание данных и передача их непроверенными и нечистыми в system позволит любому, кто использует вашу программу, запускать команды в оболочке.

Это угроза безопасности.

3 голосов
/ 05 февраля 2011

Создайте строку, которую вы передаете system(), с помощью потока строк!

#include <sstream>
#include <fstream>
#include <string>
using namespace std;

int main(void){
    string line;
    ifstream myfile("aaa.txt");
    getline(myfile,line);
    stringstream call_line;
    call_line << "curl.exe -b cookie.txt -d test=" << line << "  http://example.com");
    system(call_line.str().c_str());
}
...