2017-02-20 53 views
2

В процессе работы на пути к (безопасно) нагрузки заданий из конфигурационных файлов, я пытаюсь придумать функции оболочки, которая бы:Safe (и ограничения) версия Eval

  • с произвольным строка, принятая в качестве первого аргумента, применяет безопасные расширения (т.е. переменные расширения, ${} разложений ...), но блокирует любое небезопасное расширение (в том числе, если оно вложено в другие конструкции).
  • Присвоить результат имени переменной, полученному в качестве второго аргумента (имя переменной можно считать безопасным для целей этого вопроса)
  • Предпочтительно быть чистой оболочкой (для меня характерна Bash-специфическая), но предложение, использующее внешняя команда будет в порядке, если она обеспечивает лучшие результаты, не слишком сильно ухудшает производительность и зависит от утилит, обычно присутствующих при базовой установке UNIX-подобных операционных систем.
  • Выполните расширение, избавляясь от котировок «первого уровня», как это сделала бы оболочка.

Вот пример (предполагая функцию safeval встречи выше, и уже загружены в текущем контексте):

export A=1 
safeval '$A$(ls /)' B 
echo "$B"  # Echoes 1$(ls /) 
safeval '"a""b"' C 
echo "$C"  # Echoes ab 
+0

За исключением принятия второго аргумента - который легко добавлен - [this] (http://stackoverflow.com/a/29268513/45375) ответ моего, который мы [ранее обсуждали] (http: // stackoverflow.com/a/42328711/45375) удовлетворяет вашим требованиям (за исключением того, что вы хотели посмотреть на замену вызовов 'tr' с расширением параметров оболочки). – mklement0

+1

@ 123 Я не думаю, что поиск будет соответствовать моим требованиям безопасности. – Fred

+0

@ mklement0 Я предоставлю ответ, основанный на вашем ответе выше, но это не делает то же самое. Пожалуйста, несите меня. – Fred

ответ

0

После предыдущего вопроса я спросил ( Reading assignments from configuration files) и ответ с комментариями mklement0 что привело меня к ответу mklemen0 по этому вопросу: Bash Templating: How to build configuration files from templates with Bash?, я придумал потенциальное решение, на котором я ищу обратную связь, особенно в отношении его режимов безопасности и потенциальных сбоев, которые я, возможно, пропустил.

# 
# Argument 1 : string to safely expand 
# Argument 2 : name of the variable to which expanded value will be assigned 
# 
safeval() 
{ 
local _v=$1 
_v=${_v//\$\(/\$$'\1'} 
_v=${_v//\$\[/\$$'\2'} 
_v=${_v//'`'/$'\3'} 
_v=${_v//\\ /$'\4'} 
_v=${_v// /$'\5'} 
eval printf -v _v %b "$_v" || return 1 
_v=${_v//$'\1'/\(} 
_v=${_v//$'\2'/\[} 
_v=${_v//$'\3'/'`'} 
_v=${_v//$'\4'/\\ } 
_v=${_v//$'\5'/ } 
printf -v "$2" %s "$_v" 
} 

Пожалуйста, обратите внимание, что это (следует, как мне кажется) обрабатывать разрывной процитировать строки из комплекта поставки (например, '"a"b"c" на входе будет назначен в качестве abc).

Этот код призван сделать следующее:

  • Remplace все вхождения $(, '$ [' и `с (надеюсь) безопасных строк.
  • Затем выполняют eval
  • Затем вернитесь
  • делать это только с особенностями оболочки

Есть несколько преодолимые заданий, которые я все время в ответ целях удобочитаемости, и я бы удалить в конечном коде , Я также, вероятно, переадресую stderr первого printf на /dev/null.

Я использовал %b как строковый формат для printf, чтобы разрешить такие вещи, как новые строки в файлах конфигурации. Прокомментируйте, приветствуется ли это хорошая или плохая идея.

+0

Даже если ответ решает проблему, IMHO, код очень подходит для codereview SE, а не здесь. – Inian

+1

@ Inian Я не знал о SE codereview! – Fred

+0

@Inian Я добавил вопрос о codereview: http://codereview.stackexchange.com/questions/155842/safe-and-restricted-version-of-eval?noredirect1_comment295051_155842. Спасибо за совет. – Fred