JavaScript验证上传文件是否是其扩展名

时间:2018-11-29 22:40:58

标签: javascript validation upload

我遇到了一种情况,我试图验证仅允许某些类型的文件上传。

我正在使用的方法是检查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",正则表达式接受。

如何验证图像文件实际上是图像文件,而不是重新标记的东西?

1 个答案:

答案 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之类的库来轻松实现此目的。