Этот подход кажется правильным, но я бы приветствовал исправления, если он неправильный:
Если флаг WRDE_NOCMD
не указан, не проверяйте.Спецификация для wordexp
гласит, что приложение
должно гарантировать, что слова не содержат символов без кавычек или каких-либо специальных символов без кавычек ...
и тамконечно, никакой пользы для безопасности не получено от проверки поддельных специальных символов вне контекста подстановки команд, когда подстановка команд уже разрешена.
Теперь, если указано WRDE_NOCMD
, последовательно обрабатывать строку, сохраняя флаг длянаходимся ли мы в одинарных или двойных кавычках.
- Обнаружение обратной косой черты в контексте без одинарных кавычек пропускает следующий символ.
- Обнаружение одинарных кавычекв контексте без двойных кавычек переключает контекст одинарных кавычек.
- Обнаружение двойных кавычек в контексте без одинарных кавычек переключает контекст двойных кавычек.
- Обнаружение обратного кавычка или
$(
сразу за ним не следует другой (
, в контексте без кавычек получается WRDE_CMDSUB
. - При обнаружении любых специальных символов в контексте без кавычек получается
WRDE_BADCHAR
.
Поскольку мы собираемся запретить все подстановки команд, нет вложенных контекстов $(
, о которых следует беспокоиться;вход на первый уровень уже приводит к ошибке.
Я сделал здесь какие-нибудь глупые (или тонкие и не настолько глупые) ошибки?