这是我参与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;
}
- 拿到文件路径
- 获取文件路径中最后一个点"."的位置
- 通过文件路径的点的位置截取文件后缀
- 判断是否是图片,或者是否是需要的文件类型,并且转大小写判断。
可以伪造,只能在前端进行简易的验证
二、判断文件的Content-type
这个的原理是Content-typed的值是取决于文件的扩展名,当你改变文件后缀,再次上传Content-type也会随着改变。
而且Content-type可以伪造,例如使用postman就可以改变ContentType信息进行上传。
三、通过二进制信息确认文件格式
- 使用VsCode装一个hexDump插件,右击图片查看 Show Hexdump查看二进制源文件
- 每个图片都有自己的格式,不用.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、再获取文件的二进制信息的前缀和后缀码判断
最后,如果有更好的验证文件类型使其更安全更可靠可以留言探讨,感谢阅读。