文件上传-判断文件格式

2,511 阅读2分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

一、通过文件名后缀判断文件类型

var filePath = "file://images/abc.png";//文件路径
var dotIdx= filePath.lastIndexOf(".");//获取最后一个.的位置
var suffix = filePath.substr(dotIdx+1);//获取文件后缀

//判断是否是图片
function isImage(suffix) {
    return ['png', 'jpg', 'jpeg', 'gif'].indexOf(suffix.toLowerCase()) !== -1;
}
  1. 拿到文件路径
  2. 获取文件路径中最后一个点"."的位置
  3. 通过文件路径的点的位置截取文件后缀
  4. 判断是否是图片,或者是否是需要的文件类型,并且转大小写判断。

   可以伪造,只能在前端进行简易的验证

二、判断文件的Content-type

这个的原理是Content-typed的值是取决于文件的扩展名,当你改变文件后缀,再次上传Content-type也会随着改变。

而且Content-type可以伪造,例如使用postman就可以改变ContentType信息进行上传。

三、通过二进制信息确认文件格式

  1. 使用VsCode装一个hexDump插件,右击图片查看 Show Hexdump查看二进制源文件
  2. 每个图片都有自己的格式,不用.png、.jpg、.gif格式判断(可以伪造)

         PNG格式:前八个16进制的码是89 50 4E 47 0D 0A 1A 0A

       JPG格式:前两个进制码是FF D8和结尾两个进制码是FF D9

ps:还有很多文件类型都有固定的16进制码进行验证,这里只是举例子,可以百度看下。

可以通过这个这些编码来进行文件校验,这样是比较准确的,因为后缀名可以修改,但是修改文件名后缀这些编码也不会改变,这样是比较精确的验证了。但是这个一般是通过后端实现,不过也**可以伪造,**基本上就是渗透无处不在吧,经验比较少只了解到这一步。

四、总结

1、前端可以通过判断文件名后缀进行第一次过滤文件类型(虽然不是很有用)

2、后端获取文件的Content-type进行判断是否是需要的文件类型进行第二次过滤

3、再获取文件的二进制信息的前缀和后缀码判断

最后,如果有更好的验证文件类型使其更安全更可靠可以留言探讨,感谢阅读。