允许用户上传自定义图片或视频的场景,如何防止被上传恶意代码?

2020-10-18 09:55:41 +08:00
 black11black
如题,假如应用场景是想要做一个图床的话,允许用户自定义上传,如果系统做的特别糟糕是有可能被上传二进制并执行的。

很好奇现在通用的安全防范做法是什么,如何确保用户上传的图片确实是图片?

自己写二进制分析感觉不太靠谱,工作量太大且不准确。如果交给 ffmpeg 这种工具转码一次的话能规避吗? ffmpeg 等工具有没有出现过 0day 被利用的情况?

另外统一转码的话开销也很大,图片的话有损压缩会导致失真,视频的话则是太慢。以前记得 B 站做过直传视频后码率合规就不转码的操作,他们怎么处理的,如果用户传的视频外挂了二进制文件会怎么办

很好奇,谢谢大家
4337 次点击
所在节点    问与答
44 条回复
OldActorsSmile
2020-10-18 10:00:12 +08:00
我刚好最近也在做图床,我只在前端检验文件扩展名,我觉得,哪怕有代码,放在一个.jpg 后缀的文件传上来也不会被执行。

我的图床是 http://imgbed.cn ,支持视频
nvkou
2020-10-18 10:05:14 +08:00
前端靠不住。后端或则 lambda 分析下数据流的头,找特征码。格式是固定的。不对劲就拒绝
cmdOptionKana
2020-10-18 10:09:06 +08:00
linux 有权限设置,用户上传的文件用 0666 或 0600 保存,就不会被执行。
black11black
2020-10-18 10:27:11 +08:00
@cmdOptionKana 服务器被提权只是一种极端情况,一般来说如果网站本身不受攻击,但被用来分发恶意二进制文件,应该也是网站方面不可接受的吧
black11black
2020-10-18 10:28:28 +08:00
@OldActorsSmile 如果你这么设计的话感觉被恶意利用的是很容易发生的,比如如果我把二进制拆分上传,把你的图床当做免费网盘来用
zhangshine
2020-10-18 10:44:27 +08:00
加个免责声明
cmdOptionKana
2020-10-18 10:47:50 +08:00
@black11black 图床必然需要 “生成缩略图” 这一步,这里就可以发现是否真的图片。
InternetExplorer
2020-10-18 11:04:39 +08:00
不要把系统做的这么糟糕
unixeno
2020-10-18 11:09:15 +08:00
检查 magic number 呗
OldActorsSmile
2020-10-18 11:12:26 +08:00
@black11black

我后续会增加一些限制,比如每日上传数量超过一定量就启用图形验证码。
spohar
2020-10-18 11:13:46 +08:00
文件重命名,限制文件夹权限不可执行。 强烈推荐白名单方式,只允许固定格式上传服务端校验.此外,对于图片的处理,可以使用压缩函数或者 resize 函数,在处理图片的同时破坏图片中可能包含的 HTML 代码。
Ptu2sha
2020-10-18 11:19:45 +08:00
我想知道你怎么把恶意代码放在 nginx 的服务器上通过 web 访问来执行?
你想通了这个问题就不存在了
hzwjz
2020-10-18 11:27:34 +08:00
最近在看 Go in Practice,其中 Technique 46 列举了三种方法

- 使用 request headers 中的 Content-Type, 但是这个是有上传文件的客户端设置的。
- 与 MIME type 关联起来的文件扩展,这个可以提供简单的分析出文件的类型
- 解析文件的并且根据文件内容来检测文件内容的类型。 这也是 @nvkou 所说的那种方法了。

使用 `http` package 中的 `DetectContentType` 检测文件的头 512 bytes 。
black11black
2020-10-18 11:34:40 +08:00
@Ptu2sha 垃圾的业务代码当然可以做到,这个问题没意义。
black11black
2020-10-18 11:35:32 +08:00
@unixeno magic number 是啥,大佬讲讲
black11black
2020-10-18 11:36:10 +08:00
@OldActorsSmile 问句题外话,你的检验是怎么做的,业务端维护一个访问计数吗
black11black
2020-10-18 11:39:50 +08:00
@hzwjz
@nvkou 听起来是个防君子不防小人的做法,比如我在正常的图片后面帖一段二进制代码,你校验特征应该是一样的。我不知道现在还有没有那种打开图片的同时也能打开附加二进制的神奇漏洞了
masy
2020-10-18 12:20:53 +08:00
@OldActorsSmile 我的论坛都被恶意用户上传了一句话木马改后缀名.jpg 作为头像。按理开源的论坛安全性也是差不多的,我技术有限也不能突破非正常图片的上传限制,也不知道那个恶意用户是怎么成功上传的。一句话木马基本上把站给端了。
mumbler
2020-10-18 12:39:06 +08:00
ffmpeg 转码成功就肯定是安全的,你可以拿个二进制伪装视频传 B 站试试啊,看 B 站是如何处理的
Track13
2020-10-18 12:40:22 +08:00
@black11black 很久以前的免流就是这么干的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/716054

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX