系统中需要用到文件上传的功能,但是从系统安全的角度上来说需要判断上传文件的格式,防止将病毒木马等有害的文件上传到服务器上。
判断文件类型有三种方式
1、通过文件后缀名
这个方法简单容易,但是也是最容易被欺骗的方法,修改文件的后缀名即可实现欺骗系统。
2、通过Content-Type判断
这个是通过判断文件的MIME类型进行判断,我们在通过form表单上传文件时,在上传的request域里面会获取当前文件的MIME类型,我们可以通过控制接收文件的MIME类型进行判断。这个方法如果通过抓包的形式进行修改类型也不安全。
安全问题详解:
https://www.cnblogs.com/dunitian/p/5645339.html
注意:现在遇见一个问题就是在angular框架下通过consumes参数进行控制上传文件类型时,当错误类型时会产生415(不被允许的多媒体类型),但是正确类型时,会产生ERROR_CONNECTION_RESET连接重定向错误。(待解决)
3、通过文件流判断文件头
package utils
import (
"bytes"
"encoding/hex"
"strconv"
"strings"
"sync"
)
var fileTypeMap sync.Map
func init() {
fileTypeMap.Store("ffd8ffe000104a464946", "jpg") //JPEG (jpg)
fileTypeMap.Store("89504e470d0a1a0a0000", "png") //PNG (png)
fileTypeMap.Store("47494638396126026f01", "gif") //GIF (gif)
fileTypeMap.Store("49492a00227105008037", "tif") //TIFF (tif)
fileTypeMap.Store("424d228c010000000000", "bmp") //16色位图(bmp)
fileTypeMap.Store("424d8240090000000000", "bmp") //24位位图