С GNU tar это просто
tar -xvf untrusted_file.tar
в пустой директории. GNU tar автоматически удаляет /
имена ведущих членов при извлечении, если явно не указано иное с --absolute-names
опцией . GNU tar также определяет, когда использование ../
приведет к извлечению файла за пределы каталога верхнего уровня, и вместо этого помещает эти файлы в каталог верхнего уровня, например, компонент foo/../../bar/qux
будет извлечен, как bar/qux
в каталоге верхнего уровня, а не bar/qux
в родительском каталоге верхнего уровня. , GNU tar также заботится о символических ссылках, указывающих вне каталога верхнего уровня, например, foo -> ../..
и foo/bar
не будет вызывать bar
извлечение вне каталога верхнего уровня.
Обратите внимание, что это относится только к (достаточно новым версиям) GNU tar (а также к некоторым другим реализациям, например, * BSD tar и BusyBox tar). Некоторые другие реализации не имеют такой защиты.
Из-за символических ссылок используемая вами защита будет недостаточной: архив может содержать символическую ссылку, указывающую на каталог вне дерева, и извлекать файлы в этом каталоге. Нет способа решить эту проблему, основываясь исключительно на именах членов, вам нужно изучить цель символических ссылок.
Обратите внимание, что при извлечении в каталог, который уже содержит символические ссылки, гарантия может больше не действовать.