php文件上传验证方法,PHP验证上传文件

以前,我用 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值