前天发了一个关于不小心解压zip文件内容到当前目录的处理,结果被微信推到流量池了,一晚上几千个人浏览,还给我评论指出问题,现在我意识到问题了,我再更新一下内容。
对于压缩包的解压,最好还是在固定目录里解压,就是自己先mkdir一个新的目录,然后放进去解压,我发的处理方案,都是实在没办法,不小心造成的,尽量规避这样的情况,养成好习惯后就能大幅避免。
zipinfo -1 path/xx.zip | xargs rm -rf这个命令是大家留言和推荐的,我用的是unzip -Z1 new-api.zip | xargs rm -rf。
这两个其实没区别,风险一样的大。
它们只是用来“提取 ZIP 文件列表”的工具不同,但最终输出的内容、格式,以及后面接 xargs rm -rf 的危险行为一模一样。
zipinfo -1 path/xx.zip | xargs rm -rf | unzip -Z1 new-api.zip | xargs rm -rf | ||
|---|---|---|---|
| 核心功能 | 无 | ||
| 输出格式 | 无 | ||
| 对空格的处理 | 无 | ||
对 /、..、/* 的处理 | 无 | ||
| 最终删除行为 | 无 | ||
| 命令来源 | zipinfo | unzip-Z1 模式 | 唯一区别 |
| 系统依赖 | zipinfo(很多系统和 unzip 一起装) | unzip(几乎所有 Linux/macOS 都自带) |
-Z1 这么像?unzip -Z1 其实就是 unzip 内置的 zipinfo 模式。unzip -Z1 等价于 zipinfo -1。unzip -Z1 来替代 zipinfo,因为 unzip 更常用、更稳定。一句话总结: 你把 zipinfo -1 换成 unzip -Z1,就跟把“苹果”换成“红富士苹果”一样——效果一模一样,危险程度也完全相同。
这两条命令依然是核弹级危险:
../ 或 / 开头 → 可能删到上级目录甚至系统文件* 或 /* → 直接变成 rm -rf /*(系统直接完蛋)无论你用哪一条,都一样会出事!
# 1. 最安全(推荐):null 分隔 + 预览,带上根目录排查unzip -Z1 new-api.zip | grep -E '^[^/]+/?$' | tr '\n''\0' | xargs -0 -I {} echo"将要删除:{}"# 确认没问题后再把 echo 换成 rm -rfunzip -Z1 new-api.zip | tr '\n''\0' | xargs -0 rm -rf
我看评论说,加入zip压缩包里,文件名有空格,就倒霉了。
这样说是有道理的。
我自己测试了一下,创建3个文件名字分别是:
/*test1 test2test3第一个文件名字代表了根本目录所有文件。
第二个文件名字有空格。
第三个文件就是普通文件。
#仅用于学习测试python3 -c 'import zipfilewith zipfile.ZipFile("danger.zip", "w") as z: z.writestr("/*", "恶意内容 - 文件1 /*".encode("utf-8")) z.writestr("test1 test2", "恶意内容 - 文件2 带空格".encode("utf-8")) z.writestr("test3", "恶意内容 - 文件3".encode("utf-8"))print("ZIP 创建完成!")'这个确实是恶意的zip文件。
返回:
[root@kichen test]# python3 -c ' zipfile.ZipFile> import zipfile("danger.zip", "> with zipfile.ZipFile("danger.zip", "w") as z:> z.writestr("/*", "恶意内容 - 文件1 /*".encode("utf-8"))> z.writestr("test1 test2", "恶意内容 - 文件2 带空格".encode("utf-8"))> z.writestr("test3", "恶意内容 - 文件3".encode("utf-8"))> print("ZIP 创建完成!")> 'ZIP 创建完成![root@kichen test]# lsdanger.zip [root@kichen test]# unzip -Z1 danger.zip/*test1 test2test3如果这个zip压缩包,用我说的代码:
#保险期间,我还是把后面注释掉吧unzip -Z1 danger.zip #| xargs rm -rf#或者zipinfo -1 danger.zip #| xargs rm -rf这样,就会把根目录大部分文件删掉。
千万别试!!!!!!!!!!!!!!
返回:
[root@kichen test]# unzip -Z1 danger.zip/*test1 test2test3[root@kichen test]# zipinfo -1 danger.zip/*test1 test2test3这样,虽然带空格的文件能删除,但是,也会删除根目录下几乎所有文件和目录,后果极其严重(系统很可能无法启动)。”
如果用我纠正后的代码:
unzip -Z1 danger.zip | grep -E '^[^/]+/?$' | tr '\n''\0' | xargs -0 -I {} echo"将要删除:{}"返回:
[root@kichen test]# unzip -Z1 danger.zip | grep -E '^[^/]+/?$' | tr '\n' '\0' | xargs -0 -I {} echo "将要删除:{}"将要删除:test1 test2将要删除:test3即便是不加前面的根目录排除:
[root@kichen test]# unzip -Z1 danger.zip| tr '\n' '\0' | xargs -0 -I {} echo "将要删除:{}"将要删除:/*将要删除:test1 test2将要删除:test3自己不是眼瞎的话,也能看到 /*这个根目录。
所以总结一下,盲目的用zipinfo -1 和unzip -Z1,是有很大风险的,好习惯还是养成,解压文件,要新建一个目录,另外程序员里好人还是多,没人故意做danger.zip这种核弹。
最后,重申一遍:
以上测试完全是学习交流,请勿测试,如果闯祸,后果自负!另外,永远不要用 root 权限解压来历不明的 ZIP!