2010-10-27 3 views
4

Из программы C я хочу вызвать сценарий оболочки с именем файла в качестве параметра. Пользователи могут управлять именем файла. C-то вроде (инициализация/проверка ошибок опущена):Есть ли способ предотвратить выполнение команды sh/bash?

sprintf(buf, "/bin/sh script.sh \"%s\"", filename); 
system(buf); 

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

+1

Используйте одиночные кавычки '' 'вместо этого. Баш не заменит это. То есть 'sprintf (buf,"/bin/sh script.sh '% s' ", filename);'. Тогда все зависит от того, что делает 'script.sh'. Вы также можете указать '-r' для ограниченной оболочки, но есть некоторые ограничения того, что вы можете сделать в такой оболочке, см. Раздел« ОГРАНИЧЕННЫЙ ОБОЛОЧКА »на странице руководства bash для более подробной информации. – 2010-10-27 19:23:43

ответ

0

Попробуйте запустить «unalias» в системной функции.

0

Поскольку вы помечены это как C Я обеспечу вам C ответ. Вам нужно будет избежать имени файла - создайте новую строку, которая будет обработана должным образом оболочкой, так что такие вещи, как This is a file name, производят This\ is\ a\ file\ name или bad;rm *;filename, становятся bad\;rm\ \*\;filename. Затем вы можете передать это оболочке.

Другим способом было бы запустить оболочку непосредственно с помощью fork и одной из функций exec. Передача аргументов непосредственно в программы не приводит к расширению или интерпретации командной строки оболочки.

0

Как сказал Шарт, вы не должны использовать system, но fork и execv самостоятельно. Но чтобы ответить на вопрос о том, как сделать строки безопасными для передачи в оболочку (если вы настаиваете на использовании system), вам нужно избежать строки. Самый простой способ сделать это - сначала заменить каждое появление ' (одинарная кавычка) на '\'' (одинарная кавычка, обратная косая черта, одинарная кавычка, одинарная кавычка), затем добавить ' (одинарная кавычка) в начале и конце строки. Другой довольно простой (но обычно менее эффективный) метод заключается в том, чтобы поместить обратную косую черту перед каждым отдельным символом, но тогда вам все равно нужно сделать некоторые специальные трюки с метками для обработки встроенных строк, поэтому я предпочитаю первый метод.