Ловушки системы вызова (3) или popen (3) с постоянной строкой?

Предполагая на секунду, что вы явно задали «проблемные» переменные среды, такие как PATH , IFS и, возможно, некоторые из переменных LC_* , насколько плоха идея заключается в использовании popen и system со строкой, значение которой является константой времени компиляции (чтобы допускать различия между Unices и странностями, такими как non-POSIX /bin/sh ).

Например, если у меня есть код C, который использует фрагмент, подобный приведенному ниже, для выполнения поиска по глубине в текущем каталоге, это проблема с точки зрения безопасности / правильности?

 FILE* fh = popen("2>/dev/null /usr/bin/find . -print0 -type f"); 

EDIT: пример, который заставляет чистую среду и не включает непереносимые опции

 FILE* fh = popen("2>/dev/null /usr/bin/env -i /usr/bin/find . -type f"); 

One Solution collect form web for “Ловушки системы вызова (3) или popen (3) с постоянной строкой?”

Предполагая на секунду, что вы явно задали «проблемные» переменные среды, такие как …

Не делай этого.

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

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

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

  • Виртуальная среда командной строки unix на iPad
  • каковы флагов этой микроархитектуры?
  • Можете ли вы использовать LXC через C?
  • Использование флагов компиляции gcc
  • Поддержание единой бинарной системы в дистрибутивах Debian
  • Поиск зависимостей для скомпилированной программы на C ++
  • После fork (), где ребенок начинает свое выполнение?
  • Перенаправление вывода при выполнении «bash -c ...» из программы C
  • Динамический компоновщик "недоступна информация о версии"
  • Ищете ресурсы: например, C doc для чтения файлов и их атрибутов? (В Linux)
  • Выполнение процесса несколько раз в одно и то же время
  • Interesting Posts

    Возьмите подмножество файла, относящегося к отметке времени

    Почему в /var/log/kern.log есть нули?

    Как разделить строку по разделителю строк в bash?

    Как фильтровать файлы pcap с помощью tshark

    можно ли предположить, что мои используемые команды существуют по умолчанию почти со всеми дистрибутивами

    Почему tmux может быть установлен только один раз на сеанс оболочки?

    Как узнать, какой параметр конфигурации ядра включен моим драйвером?

    Как заменить символ в sed, только если это происходит до буквы?

    Поставьте систему в режим низкого энергопотребления в режиме ожидания

    Назначение '&& bash' в команде (не часть '&&', часть 'bash')

    Веб-сервер для встроенной Linux

    Каталог в / proc, который не является процессом, но начинается с номера?

    Как процесс управления apache передает новое соединение с одним из его детей?

    Заголовок запроса для Cache-Control не работает

    Как сделать экран черно-белым?

    Linux и Unix - лучшая ОС в мире.