Go语言 通过文件流判断文件头来识别文件类型

本文介绍了在Go语言中判断文件类型的三种方法,包括通过文件后缀名、Content-Type和文件流判断文件头。重点讨论了通过文件流判断文件头的方式,这是相对更安全的判断方法,可以防止上传恶意文件到服务器。同时提到了在Angular框架下设置上传文件类型时遇到的问题。
摘要由CSDN通过智能技术生成

系统中需要用到文件上传的功能,但是从系统安全的角度上来说需要判断上传文件的格式,防止将病毒木马等有害的文件上传到服务器上。

判断文件类型有三种方式

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位位图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值