Что касается вопросов безопасности, классическим примером (4) является следующий сценарий: представьте, что пользователю предлагается указать какое-то имя каталога для резервного копирования в std::string dirname
; тогда вы вычислите какое-нибудь имя директории резервного копирования в std::string backup
и выполните
system((std::string{"cp -a "} + dirname + " " + backup).c_str())
Теперь подумайте, что произойдет, если злонамеренный пользователь введет foo bar; rm -rf $HOME; ls
в качестве dirname
и backup
будет /vol/backup_2015_fev/
. Команда system
будет выполнять
cp -a foo bar; rm -rf $HOME; ls /vol/backup_2015_fev/
это не то, что вы ожидали (все $HOME
пользователя будут удалены!). Это пример внедрения кода , и при использовании system
вы должны убедиться, что этого никогда не произойдет (например, путем очистки и / или экранирования каждой строки, связанной с пользовательским вводом)
Кроме того, PATH
может отличаться от того, что вы считаете (например, начиная с /tmp/
и злонамеренный пользователь сделал ln -s /bin/rm /tmp/cp
до запуска system
).