您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

判断用户上传的图片为正常的图片

2024/8/3 13:55:31发布84次查看
文件上传是我们常常需要开发的功能,试试用最安全的方式,判断用户上传的图片为正常的图片(jpg\gif\png)。
解题思路:
1、检查提交的文件的扩展名是否是图片(这一步很容易伪造的,所以不可靠)
2、依据文件的头信息检查文件是否真的是图片 (这一步基本就是图片了,但是依然可能包含木马的脚本)
3、用正则检查文件里面是否包含木马的脚本
以下是“坚持到底”的php版本代码   
getextension(); //第一道关卡,简单过滤非法文件。 if(!in_array($extname,$imagetype)){ exit('只能上传gif、png和jpg的图片'); } //依据文件头信息检查图片的真实类型 //1 imagetype_gif //2 imagetype_jpeg //3 imagetype_png $realtype=exif_imagetype($_files['userfile']['tmp_name']); if( 1 == $realtype || 2 ==$realtype || 3 ==$realtype){ //开始检查是否存在木马代码 $safe=is_safe($_files['userfile']['tmp_name']); if(!$safe){ exit ('图片包含木马,禁止上传!'); } if (move_uploaded_file($_files['userfile']['tmp_name'], $uploadfile)) { echo 文件上传成功.\n; } else { echo 上传失败!\n; } }else{ exit ('只能上传gif、png和jpg的图片'); } function is_safe($fileurl) { $handle = fopen($fileurl, 'rb'); $filesize = filesize($fileurl); fseek($handle, 0); if ($filesize > 512) { // 取头和尾 $hexcode = bin2hex(fread($handle, 512)); fseek($handle, $filesize - 512); $hexcode .= bin2hex(fread($handle, 512)); } else { // 取全部 $hexcode = bin2hex(fread($handle, $filesize)); } fclose($handle); /* 匹配16进制中的 */ /* 匹配16进制中的 */ /* 匹配16进制中的 大小写亦可*/ //匹配表示有木马 return !preg_match(/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3c534352495054)|(2f5343524950543e)|(3c736372697074)|(2f7363726970743e)/is, $hexcode); }
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product