我的网站允许[txt,csv,pdf,xlsx,xls,doc,docx,mp4...]等文件上传,为了防止被恶意攻击,
我并不希望类似[exe,bat...]等文件伪装成上述文件上传到我的网站,
我怎么样才能验证上传的添付文件的内容和扩展名是否一致
不太理解你这个需求,文件扩展名就是区分文件内容的。比如你把xlsx改成txt,就直接乱码了
.cmd 和 .bat 也是用文本写的然后改的扩展名
通过jmimemagic.jar mime-util.jar 这两个包判断文件是否伪装后缀。
https://blog.csdn.net/love_hui_qiu/article/details/105453333
https://www.cnblogs.com/jiaoyiping/p/4324913.html
感觉这个需求行不通的,因为所有文件机器识别的都是二进制流。没有说是二进制流前几位就是来说明是文件格式的,所以没法判断。
还有就是你这个需求可能有些不签当.exe文件修改为.txt已经变成.txt了,那相对也就没攻击性了啊
利用魔数。
你的思路有问题,首先你只支持[txt,csv,pdf,xlsx,xls,doc,docx,mp4...]等文件上传是吧,那么你在后台接口接收到文件时,是可以获取到文件后缀名的,如果不满足你直接不存储就行了,自然就过滤掉那些非法后缀。至于防篡改应该是加密传输,你可以采用二进制传输或者接口加密啊。
使用魔数就可以做到你说的,有人恶意更改文件后缀,但是二进制文件中的魔数是改不了的,但是有些文件没有魔数,正常的jpg、jpeg、class文件都是拥有魔数的,即使你更改了文件后缀,二进制文件魔数是固定的,更改不了。可以利用这个判断。如果不清楚魔数是什么?可以去看下《深入理解java虚拟机第3版》第6章类文件结构中关于魔数的介绍你就懂了。