遇到的图床问题
看上去是一个白图
如果打开图片链接看到的是下面的图会不会觉得很疑惑,看到是一个白色的图

下载下来有812KB大小,把文件改个.ts后缀结尾还能进行播放,

看上去是一个Chrome图标
如果打开图片链接看到的是下面的图会不会觉得很疑惑,看到是一个Chrome图标

下载下来有3M大小,把文件改个.ts后缀结尾还能进行播放,

分析这些图片
参考网上同学的分析方法
FFmpeg 如何播放带「图片」的 M3U8 视频,IJKPlyaer 适配非标 TS 文件
1、以二进制方式打开白图文件,vi -b 文件,可以看到FFmpeg.Service01信息,前面用了一个png头部信息,后面是一个ts文件,如下所示:

使用foremost对文件进行拆分,可以得到一个png文件和audit.txt信息,头部是一个150*195的513字节 png文件,就是我们看到的白图

2、以二进制方式打开图标文件, vi -b 文件,可以看到ae42 6082信息,前面用了一个png完整的信息,后面是一个ts文件,如下所示:

使用foremost对文件进行拆分,可以得到一个png文件和audit.txt信息,头部是一个50*50的352字节 png文件,就是我们看到的chrome图标文件

进行防护
1、Java自带的Image.io去判断上传的图片是否是一个TS视频伪装的图片(JAVA中BufferedImage、ImageIO、Graphics2D用法和(转载)Java对上传的图片进行格式校验以及安全性校验),这种可以识别第一种伪装(把PNG的图片特征码一部分加到TS文件前面),对第二种伪装(把一个完整的PNG图片放到TS前面)会识别为一个正确的图片对象;
2、使用开源的binwalk(binwalk)去判断,对白图和图标两种伪装都可以完美识别。


3、自己写一个检测脚本来实现,比如用Python去判断文件开头和结尾是不是符合PNG文件特征码,缺点是需要自己去实现全部的图片格式特征码判断,比较麻烦。
if content[:8] == b'\x89\x50\x4e\x47\x0d\x0a\x1a\x0a' and content[-8:] == b'\x49\x45\x4e\x44\xae\x42\x60\x82':
print(u"是一张正确的png图片")
return True
else:
print(u"不是一张正确的png图片")
return False
总结
在CDN这里用TS视频伪装图片进行撸羊毛比较普遍,实现起来也不难,防护起来也是最难的。目前最好的防护还是将图片的上传交给后端服务,前端任何接口都不负责上传。通过图片接口上传验证秘钥,CDN域名添加流量预警等手段来防护,防止被利用而带来的流量费用损失。