Ловушки системы вызова (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 вы использовали, поэтому, если вы их используете, вы зависите от версии внешней программы, которая их поддерживает.

  • Почему argv включает имя программы?
  • Можно ли записать в другие файловые дескрипторы в C?
  • Ошибка при загрузке разделяемых библиотек
  • Странное поведение с динамически загружаемыми плагинами
  • Изменение оболочки по умолчанию для пользователей
  • Как установить CLang с использованием предварительно скомпилированных двоичных файлов?
  • Наиболее распространенная кодировка для строк в C ++ в Linux (и Unix?)
  • Система («пауза») в Unix?
  • Как авторизовать монофонические приложения C # при запуске PIP Raspberry?
  • Я не могу получить исходный код источника Realtek 8723
  • Ошибка файла conio.h
  • Как выбрать время чтения и записи?
  • Interesting Posts

    Поиск отсутствующего последовательного номера в файле данных

    Отключите Энергоэффективный Ethernet (eee) aka Green Ethernet

    Целевые пакеты (main / binary-amd64 / Packages) настраиваются несколько раз в /etc/apt/sources.list.d/google-musicmanager

    Как заставить WiFi работать автоматически?

    Установить ширину закладки в терминале GUI

    Скопируйте только последнюю строку последовательного вывода из весовой шкалы rs232 в буфер обмена

    Установка совместного использования CIFS в режиме, но игнорирование UID / GID

    Сделать windowmanager / desktop (Gnome) использовать только часть разрешения сервера X11 (Xvfb)

    Как добавить данные из нескольких файлов в один файл?

    Перегрузка PCI с помощью Xen

    Как выполнить удаленный сценарий оболочки через SSH и получить запрос на пароли командами, которые требуют этого в этом скрипте?

    Режим редактирования цвета Vim

    Есть ли способ редактировать текстовый файл без его открытия?

    Как я могу найти использование ресурсов ЦП процесса и всех его дочерних элементов

    Создание каталогов из строк файла

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