Попен против системы: популярен ли поп как система? - PullRequest
6 голосов
/ 28 июля 2011

popen буферизирует вывод, а система - нет. это единственная разница?

Я понимаю, что popen и system запускают команду через оболочку. Однако является ли popen () как evil как system ()?

Ответы [ 2 ]

26 голосов
/ 28 июля 2011

Послушайте, в сущности, "система зла" - это люди, которые не думают о последствиях безопасности для своего конкретного случая использования. Единственная причина, по которой system «более злая», чем ваш собственный fork / dup / exec, заключается в том, что она используется плохо, и кто-то может ввести вредоносную командную строку. Так, например

#include <stdlib.h>

int main(int argc, char** argv){
    (void) system(argv[1]);
}

определенно тупой , потому что кто-то может ввести, например, rm -rf / в качестве аргумента. И, конечно, что-то столь же глупое можно сделать с popen .

Но затем рассмотрим что-то, что fork и exec использует пользовательскую строку для команды: точно такая же уязвимость и глупость существуют.

Зло, то есть ошибка, заключается в использовании произвольной входной строки в качестве команды без некоторой фильтрации, а не в вызове system .

7 голосов
/ 28 июля 2011

Ни система, ни популярность не являются злом. Они просто просты в использовании таким образом, что ваши программы могут быть взломаны. Если вам нужен ваш двоичный файл для запуска отдельного двоичного файла, вам нужно будет использовать один из этих вызовов. Просто используйте его правильно.

Как говорится, system("PAUSE") является излишним, когда простой cin.getline() сработает.

...