С 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). Некоторые другие реализации не имеют такой защиты.
Из-за символических ссылок используемая вами защита будет недостаточной: архив может содержать символическую ссылку, указывающую на каталог вне дерева, и извлекать файлы в этом каталоге. Нет способа решить эту проблему, основываясь исключительно на именах членов, вам нужно изучить цель символических ссылок.
Обратите внимание, что при извлечении в каталог, который уже содержит символические ссылки, гарантия может больше не действовать.