绝对安全的AspJpeg图片上传函数
基本上现在的程序对上传图片的安全性处理,要么是检查其后缀,要么是分析其文件内容,其实这两种方法都是不完美的,很多时候根本认不出真正的木马或者把正常的图片当成木马。
去年某天写个需要使用AspJpeg组件的程序,测试时随便选了个文件执行,结果ASPJPEG对象出错了。灵机一动,既然用ASPJPEG处理不是图片的文件会出错,那何不用这个来保证上传的文件绝对是正常的图片呢?于是……
<%
'--------------------------------------------------
'函数名:ChkImg
'作 用:检查图片文件是否合法
'参 数:img,图片路径,相对于网站根目录的绝对路径
'返回值:布尔类型,如果图片合法返回True,否则返回False
'条 件:服务器必须支持AspJpeg组件,如不支持,为了避免所有图片都不能上传,本函数将直接返回True
'--------------------------------------------------
Function ChkImg(img)
On Error Resume Next '为了捕获错误信息,需要让代码在出错时能继续执行
Dim RetunValue, ChkJpeg
RetunValue = True
'如果路径为空,则认为图片不合法
If isnull(img) Then ChkImg = False:Exit Function
Set ChkJpeg = Server.CreateObject("Persits.Jpeg")
If -2147221005 <> Err Then '如果组件被支持,则用组件检查图片的合法性
ChkJpeg.Open Server.mappath(img)
If Err Then
RetunValue = False
End If
Else '如果组件不被支持,则跳过直接返回True
RetunValue = True
End If
'必要的善后工作
If Err.number <> 0 Then Err.clear
Set ChkJpeg = Nothing
ChkImg = RetunValue
End Function
%>
注意:因为AspJpeg只能处理已经在服务器上的文件,所以实际运用的过程中我们需要这样做:先将图片上传到一个临时文件夹,然后检查图片的合法性,如果合法,复制图片到图片保存目录,删除临时文件并返回上传成功信息,如果非法,直接删除临时文件并返回错误警告。
因为仅仅只是用AspJpeg打开了一下图片,并未执行处理图片的操作,所以本函数的执行效率还是非常高的,经我个人的测试也是如此,使用中基本不必担心效率问题。
作者:一想千开