Simplest: замените «magic» на «eval echo».
$ eval echo "~"
/whatever/the/f/the/home/directory/is
Проблема: вы столкнетесь с проблемами с другими переменными, потому что eval - это зло. Например:
$ # home is /Users/Hacker$(s)
$ s="echo SCARY COMMAND"
$ eval echo $(eval echo "~")
/Users/HackerSCARY COMMAND
Обратите внимание, что вопрос об инъекции не происходит при первом расширении. Поэтому, если вы просто заменили magic
на eval echo
, вы должны быть в порядке. Но если вы сделаете echo $(eval echo ~)
, это будет восприимчиво к инъекции.
Аналогичным образом, если вы eval echo ~
вместо eval echo "~"
, это будет считаться удвоенным, и, следовательно, инъекция будет возможна сразу .