我遇到了一种情况,我试图验证仅允许某些类型的文件上传。
我正在使用的方法是检查64b编码的标头,以查看其是否与接受的文件匹配。
dataHeader = (b64FileString.split(';'))[0]
imgRegex = /data:image\/((jpeg)|(jpg)|(gif)|(exif)|(tiff)|(bmp)|(png)|(bpg))?$/gmi;
如果我尝试上传图像文件image.png
,则标题看起来像这样"data:image/png"
,而正则表达式可以正常工作。
此方法有效,但仅在一定程度上有效。
开始此过程时,我假设标题是基于实际文件格式的,但这不是正确的。标头实际上只是基于文件扩展名。
如果我在Windows program.exe
中有以下内容,
标题看起来像这样"data:application/x-msdownload"
正则表达式不匹配,并且文件不被接受。
如果用户将program.exe
的扩展名更改为program.png
,则
标头现在为"data:image/png"
,正则表达式接受。
如何验证图像文件实际上是图像文件,而不是重新标记的东西?
答案 0 :(得分:0)
要达到您的期望,我怀疑您将不得不分析文件数据本身,并将字节签名(magic numbers)与您希望允许的类型进行比较。如果服务器将字节流输入其中,则应该能够进行检查,如果发现无效的签名,则应尽早取消。例如,所有png
文件都以:
137 80 78 71 13 10 26 10
or in hex
89 50 4E 47 0D 0A 1A 0A
如果您使用说 node 作为后端,则可以使用file-type
之类的库来轻松实现此目的。