判断用户上传的图片为正常的图片
程序员文章站
2022-03-27 13:23:51
...
文件上传是我们常常需要开发的功能,试试用最安全的方式,判断用户上传的图片为正常的图片(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进制中的
推荐阅读
-
asp.net图片上传生成缩略图的注意事项
-
node.js中实现kindEditor图片上传功能的方法教程
-
[PHP]移动端网页如何使用JqueryMobile+PHP实现上传图片的功能
-
[PHP]移动端网页如何使用JqueryMobile+PHP实现上传图片的功能
-
用PHP抓取淘宝商品的用户晒单评论+图片实例,
-
php+html5+ajax实现上传图片的方法
-
php+js实现图片的上传、裁剪、预览、提交示例
-
静态文件服务器A和web应用服务器B分开,怎么样在B服务器上传的图片,上传到静态文件服务器应用是PHP写的?
-
vue+element-ui中的图片获取与上传
-
php is_file 判断给定文件名是否为一个正常的文件_php基础