PHP验证上传文件
怪我咯
怪我咯 2017-04-11 10:08:38
0
3
353
$finfo = finfo_open( FILEINFO_MIME ); $mimetype = finfo_file( $finfo , $this->fileInfo['tmp_name'] ); if ( $mimetype == "audio/mpeg; charset=binary" ) { return TRUE; } else { $this->error = "请上传合法文件"; return FALSE; }

为什么有些mp3文件的$mimetype是application/octet-stream; charset=binary,有些是audio/mpeg; charset=binary

application/octet-stream; charset=binary是否安全,或者怎样进一步验证上传的文件是安全的音频文件?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆 (3)
刘奇

以前,我用 python 写了一个上传文件的白名单,利用白名单内设置的16进制的头,进行比对。希望能给你一个参考。

def image_type_list(): """ 支持文件类型 用16进制字符串的目的是可以知道文件头是多少字节 各种文件头的长度不一样,少半2字符,长则8字符 :return: """ return { "FFD8FF": "JPEG", "89504E47": "PNG", "47494638": "GIF", "504B0304": "ZIP", "25504446": "PDF", "D0CF11E0": "DOC,XLS", '504B03': "DOCX,XLSX", '52617221': "TAR", '44656C69766572792D646174653A': 'EML' } def bytes2hex(bytes): """ 字节码转16进制字符串 :param bytes: :return: """ num = len(bytes) hexstr = u"" for i in range(num): t = u"%x" % bytes[i] if len(t) % 2: hexstr += u"0" hexstr += t return hexstr.upper() def is_image_file_type(binfile): """ # 获取文件类型 :param binfile:open(filename, 'rb') # 必需二制字读取 :return: """ is_image = False tl = image_type_list() for hcode in tl.keys(): numOfBytes = len(hcode) / 2 # 需要读多少字节 hbytes = struct.unpack_from("B" * numOfBytes, binfile[0:numOfBytes]) f_hcode = bytes2hex(hbytes) if f_hcode == hcode: is_image = True break return is_image
    大家讲道理

    看看github上面有没有第三方库?

      Peter_Zhu
      1. 是可以找下对应格式的文件的是对应的头信息(比如 图片文件一般都会在前2个字节标识出其格式 [需要分析读取二进制数据] ),但即使这样仍然不能确保安全,因为即使是二进制数据也可能会被伪造。

      2. 参考下 https://segmentfault.com/q/10...

        最新下載
        更多>
        網站特效
        網站源碼
        網站素材
        前端模板
        關於我們 免責聲明 Sitemap
        PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!