Выявление специальных символов без кавычек в тексте команды оболочки - PullRequest
2 голосов
/ 15 апреля 2011

Я реализую функцию wordexp, которая должна идентифицировать и при необходимости отклонять случаи подстановки команд (например, $(...) или обратные пометки), и которая, с точки зрения качества, должна также идентифицировать и отклонять в кавычки специальные символы |, &, ;, < и > всякий раз, когда подстановка команд отключена.

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

После проверки строки я передаю ее sh со следующим аргументом -c:

printf '%s\0' [string inserted here]

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

1 Ответ

0 голосов
/ 15 апреля 2011

Этот подход кажется правильным, но я бы приветствовал исправления, если он неправильный:

Если флаг WRDE_NOCMD не указан, не проверяйте.Спецификация для wordexp гласит, что приложение

должно гарантировать, что слова не содержат символов без кавычек или каких-либо специальных символов без кавычек ...

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

Теперь, если указано WRDE_NOCMD, последовательно обрабатывать строку, сохраняя флаг длянаходимся ли мы в одинарных или двойных кавычках.

  • Обнаружение обратной косой черты в контексте без одинарных кавычек пропускает следующий символ.
  • Обнаружение одинарных кавычекв контексте без двойных кавычек переключает контекст одинарных кавычек.
  • Обнаружение двойных кавычек в контексте без одинарных кавычек переключает контекст двойных кавычек.
  • Обнаружение обратного кавычка или$( сразу за ним не следует другой (, в контексте без кавычек получается WRDE_CMDSUB.
  • При обнаружении любых специальных символов в контексте без кавычек получается WRDE_BADCHAR.

Поскольку мы собираемся запретить все подстановки команд, нет вложенных контекстов $(, о которых следует беспокоиться;вход на первый уровень уже приводит к ошибке.

Я сделал здесь какие-нибудь глупые (или тонкие и не настолько глупые) ошибки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...