`

超严格的图片上传验证

 
阅读更多
<?php
define('IN_SAESPOT', 1);
 
include(dirname(__FILE__) . '/config.php');
include(dirname(__FILE__) . '/common.php');
 
if (!$cur_user) exit('error: 401 login please');
if ($cur_user['flag']==0){
    exit('error: 403 Access Denied');
}else if($cur_user['flag']==1){
    exit('error: 401 Access Denied');
}
 
if($options['close_upload']) exit('error: 403 附件上传已禁用');
 
$mw = intval($_GET['mw']);
 
$rsp = array('status'=>201, 'msg'=>'ok');
 
if($_SERVER['REQUEST_METHOD'] == 'POST'){
    if($_FILES['filetoupload']['size']){
        // 上传的文件名
        $up_name = strtolower($_FILES['filetoupload']['name']);
        // 上传文件扩展名
        $ext_name = pathinfo($up_name, PATHINFO_EXTENSION);
        
        if($options['ext_list']){
            // 如果限制扩展名
            if(in_array($ext_name, explode(",", $options['ext_list']))){
                $pass = '1';
            }else{
                $pass = null;
                $rsp['msg'] = '该文件格式不允许上传,只支持'.$options['ext_list'];
            }
        }else{
            $pass = '1';
        }
        
        if($pass){
            $is_img = null;
            
            // 尝试以图片方式处理
            $img_info = getimagesize($_FILES['filetoupload']['tmp_name']);
            if($img_info){
                //创建源图片
                if($img_info[2]==1){
                    $img_obj = imagecreatefromgif($_FILES['filetoupload']['tmp_name']);
                    $t_ext = 'gif';
                }else if($img_info[2]==2){
                    $img_obj = imagecreatefromjpeg($_FILES['filetoupload']['tmp_name']);
                    $t_ext = 'jpg';
                }else if($img_info[2]==3){
                    $img_obj = imagecreatefrompng($_FILES['filetoupload']['tmp_name']);
                    $t_ext = 'png';
                }
                //如果上传的文件是jpg/gif/png则处理
                if(isset($img_obj)){
                    // 是正确的图片格式
                    $is_img = '1';
                    $new_name = $timestamp.'.'.$t_ext;
                }else{
                    // 其它格式的图片
                    $rsp['msg'] = '该图片格式不支持,只支持jpg/gif/png';
                    // 直接取同扩展名
                    $new_name = $timestamp.'.'.$ext_name;
                }
            }else{
                // 非图片
                $rsp['msg'] = '上传的不是图片,只支持jpg/gif/png格式的图片';
                if(in_array($ext_name, array('jpg','jpeg','gif','png'))){
                    // 扩展名是图片,但不能用getimagesize识别,可能是改扩展名伪装
                    $new_name = $timestamp.'.bad-'.$ext_name;
                }else{
                    if(in_array($ext_name, array('php','htm','html'))){
                        $new_name = $timestamp.'.rename-'.$ext_name;
                    }else{
                        $new_name = $timestamp.'.'.$ext_name;
                    }
                }
            }
            
            
            ///保存
            $upload_dir = 'upload/'.$cur_uid;
            if(!$options['upyun_domain'] || !$options['upyun_user'] || !$options['upyun_pw']){
                if(!is_dir($upload_dir)) {
                    mkdir($upload_dir, 0777, true);
                }
            }
            
            $upload_filename = $upload_dir.'/'.$new_name;
            
            if($is_img){
                // 是正确的图片文件
                
                // 判断是不是动态gif
                $is_gifs = null;
                if($img_info[2]==1){
                    $out_img = file_get_contents($_FILES['filetoupload']['tmp_name']);
                    if(strpos( $out_img, chr(0x21).chr(0xff).chr(0x0b).'NETSCAPE2.0') !== FALSE){
                        $is_gifs = '1';
                    }
                }
                
                if(!$is_gifs){
                    if($img_info[0] > $mw){
                        $percent = $mw/$img_info[0];
                        $new_w = round($img_info[0]*$percent);
                        $new_h = round($img_info[1]*$percent);
                    }else{
                        $new_w = $img_info[0];
                        $new_h = $img_info[1];
                    }
                    
                    $new_image = imagecreatetruecolor($new_w, $new_h);
                    $bg = imagecolorallocate ( $new_image, 255, 255, 255 );
                    imagefill ( $new_image, 0, 0, $bg );
                    
                    ////目标文件,源文件,目标文件坐标,源文件坐标,目标文件宽高,源宽高
                    imagecopyresampled($new_image, $img_obj, 0, 0, 0, 0, $new_w, $new_h, $img_info[0], $img_info[1]);
                    // 添加水印
                    if($options['img_shuiyin']){
                        $textblack = imagecolorallocate($new_image, 155, 155, 155);
                        $shuiyin = $_SERVER['HTTP_HOST'];
                        $img_x = $new_w - (strlen($shuiyin)*8.5);
                        $img_y = $new_h-22;
                        imagestring($new_image, 4, $img_x, $img_y, $shuiyin, $textblack);
                    }
                }
                imagedestroy($img_obj);
                
                if($options['upyun_domain'] && $options['upyun_user'] && $options['upyun_pw']){
                    // 上传到又拍云
                    include(dirname(__FILE__).'/upyun.class.php');
                    
                    if(!$is_gifs){
                        ob_start();
                        imagejpeg($new_image, NULL, 95);
                        $out_img = ob_get_contents();
                        ob_end_clean();
                    }
                    
                    $upyun = new UpYun($options['upyun_domain'], $options['upyun_user'], $options['upyun_pw']);
                    // 本地调试失败
                    if($upyun->writeFile('/'.$upload_filename, $out_img, true)){
                        $rsp['status'] = 200;
                        $rsp['url'] = 'http://'.$options['upyun_domain'].'.b0.upaiyun.com/'.$upload_filename;
                        $rsp['msg'] = '图片已成功上传';
                    }else{
                        $rsp['msg'] = '图片保存失败,请稍后再试';
                    }
                    unset($out_img);
                }else{
                    // 上传到服务器
                    if($is_gifs){
                        if (move_uploaded_file($_FILES['filetoupload']['tmp_name'], $upload_filename)) {
                            $rsp['status'] = 200;
                            $rsp['url'] = 'http://'.$_SERVER['HTTP_HOST'].'/'.$upload_filename;
                            $rsp['msg'] = '图片已成功上传';
                        }else{
                            $rsp['msg'] = '图片保存失败,请稍后再试';
                        }
                    }else{
                        if(imagejpeg($new_image, $upload_filename, 95)){
                            $rsp['status'] = 200;
                            $rsp['url'] = 'http://'.$_SERVER['HTTP_HOST'].'/'.$upload_filename;
                            $rsp['msg'] = '图片已成功上传';
                        }else{
                            $rsp['msg'] = '图片保存失败,请稍后再试';
                        }
                    }
                }
                
                if(!$is_gifs){
                    imagedestroy($new_image);
                }
                
            }else{
                // 其它文件
                // $rsp['msg'] = '本站暂不支持上传非图片附件';
                // 涉及安全问题,别开放图片以外的文件上传
                // 参见 http://youbbs.sinaapp.com/t-172
                //
                if($options['upyun_domain'] && $options['upyun_user'] && $options['upyun_pw']){
                    // 上传到又拍云
                    include(dirname(__FILE__).'/upyun.class.php');
                    
                    $upyun = new UpYun($options['upyun_domain'], $options['upyun_user'], $options['upyun_pw']);
                    // 本地调试失败
                    if($upyun->writeFile('/'.$upload_filename, $_FILES['filetoupload']['tmp_name'], true)){
                        $rsp['status'] = 200;
                        $rsp['url'] = '附件:'.$up_name.'http://'.$options['upyun_domain'].'.b0.upaiyun.com/'.$upload_filename;
                        $rsp['msg'] = '附件已成功上传';
                    }else{
                        $rsp['msg'] = '附件保存失败,请稍后再试';
                    }
                    unset($out_img);
                }else{
                    // 上传到服务器
                    if (move_uploaded_file($_FILES['filetoupload']['tmp_name'], $upload_filename)) {
                        $rsp['status'] = 200;
                        $rsp['url'] = '附件:'.$up_name.' http://'.$_SERVER['HTTP_HOST'].'/'.$upload_filename;
                        $rsp['msg'] = '文件已成功上传';
                    }else{
                        $rsp['msg'] = '文件保存失败,请稍后再试';
                    }
                }
                //
            }
        }
        
    }else{
        $rsp['msg'] = '附件数据没有正确上传';
    }
    
    header("Content-Type: text/html");
    echo json_encode($rsp);
}
 
 
?>
分享到:
评论

相关推荐

    基于http协议 图片上传的前端后端实现

    在IT行业中,图片上传功能是Web应用中常见的需求,它涉及到前端与后端的交互,以及数据传输协议的使用。本示例中的“基于http协议 图片上传的前端后端实现”是一个完整的解决方案,涵盖了从用户界面到服务器处理的全...

    超漂亮的extjs界面的JSP图片上传系统.rar

    《超漂亮的ExtJS界面JSP图片上传系统详解》 在当今的Web开发中,用户界面的设计与用户体验息息相关,一个美观且功能完善的上传系统是提升网站吸引力的重要元素。本篇文章将详细解析“超漂亮的ExtJS界面的JSP图片...

    asp.net 图片上传超酷

    在处理图片上传时,服务器端的ASP.NET代码会接收文件,并进行一些验证,如检查文件类型、大小限制,防止恶意文件上传。然后,图片可能被保存到服务器的特定目录,或者存储在数据库中。如果存储在数据库,通常会选择...

    js控制的预览功能验证功能图片上传

    js控制的预览功能验证功能图片上传超好看

    会员管理图片上传

    【标题】"会员管理图片上传"所涉及到的知识点主要集中在构建一个简单的会员管理系统中,特别是与用户图片上传功能相关的部分。在这样的系统中,用户通常需要上传个人头像或者其他相关图片,这涉及到前端表单设计、...

    上传图片例子 H5

    在图片上传中,File API扮演了核心角色。它提供了`FileReader`对象用于读取文件内容,`FileList`对象用于存储用户选择的多个文件,以及`FormData`对象用于封装文件数据并发送到服务器。 2. ****: 这是HTML5中用于让...

    多图片上传

    在IT领域,多图片上传是一项常见的功能,尤其在社交媒体、电商平台和内容管理系统中。这个功能让用户能够一次性上传多个图片,极大地提高了用户体验。标题中的“多图片上传”指的是一个JavaScript库或者插件,它使得...

    Android上传图片至网络端

    在Android平台上,将图片上传至网络服务器是常见的需求,尤其在开发涉及用户交互的应用时,如社交、电商或媒体分享类应用。这个过程通常涉及到网络请求、数据编码、多线程处理以及错误处理等多个环节。以下我们将...

    html5+jquery+java后台 压缩上传图片

    在现代Web应用中,图片上传是一项常见的功能,尤其是在社交媒体、电子商务和内容分享平台。本教程将探讨如何利用HTML5、jQuery以及Java后端技术来实现图片的压缩与上传。首先,我们来详细了解一下每个组件的作用。 ...

    图片轮播 可后台上传 且带pixviewer源文件 php片 超好用

    综合以上信息,这个压缩包提供了一个完整的图片轮播解决方案,包括后台图片上传功能和前端的PixViewer展示组件。开发者可以利用`focus_ok.fla`自定义组件样式,通过`piclb.php`处理图片服务端操作,最后在网页中使用...

    uploadify H5版(uploadifive)基于html5的手机上传图片插件

    通过查看和学习这个Demo,开发者可以了解到如何在实际项目中整合uploadifive与.NET,以及如何处理图片上传的相关逻辑,比如大小限制、格式检查、文件命名规则等。 总的来说,这个插件和Demo涵盖了前端开发、HTML5新...

    js图片上传立即显示

    在JavaScript中实现图片上传并立即显示的功能是一项常见的需求,尤其在网页交互和用户界面设计中。这个过程通常涉及以下几个关键知识点: 1. **HTML表单与文件输入元素**:首先,我们需要一个HTML表单来让用户选择...

    基于PHP的图片上传系统.zip

    【压缩包子文件的文件名称列表】:“132685218441222689”看起来像是一个随机生成的文件名,可能是图片上传系统中的一个临时文件或测试文件。在实际的图片上传系统中,通常会为每个上传的图片生成一个唯一的标识符,...

    超简单文件上传,只是一个控件

    "超简单文件上传,只是一个控件"这个标题暗示我们将讨论一个简易的ASP.NET文件上传解决方案,它主要依赖于内置的FileUpload控件。C#是ASP.NET的主要编程语言,因此我们将深入探讨如何使用C#来处理文件上传。 文件...

    jquery 上传,批量上传 进度条显示

    确保正确处理文件上传的安全性,如验证文件类型、大小等。 总结来说,使用 jQuery 实现批量文件上传和进度条显示,主要涉及以下步骤: 1. 创建多文件选择的输入元素。 2. 监听文件选择事件,封装文件到 FormData ...

    php上传图片.txt

    通过以上分析,我们可以看到,这段代码提供了一个基本但功能完备的图片上传机制,它不仅处理了文件上传的基本需求,还增加了额外的安全性和效率措施,如文件类型检查、大小限制以及避免文件重名。这为开发人员提供了...

    PHP实例开发源码—php图片上传系统.zip

    【PHP图片上传系统详解】 PHP图片上传系统是Web开发中常见的功能之一,它允许用户将本地的图片文件上传到服务器,以便在网站上展示或进行后续处理。在本实例开发源码中,我们将深入探讨PHP如何实现这个功能,以及...

    php 多图片/文件上传

    最后,考虑到安全性,需要验证上传的文件类型和大小,防止恶意文件上传。例如,限制上传为图片类型: ```php $allowedTypes = ['image/jpeg', 'image/png', 'image/gif']; if (!in_array($_FILES['files']['type']...

    图片编辑HTML5网页模板

    在使用这个模板时,开发者需要考虑如何将其与后端服务集成,例如云存储服务(如Amazon S3或Google Cloud Storage)用于上传和存储用户图片,以及可能的身份验证和权限管理功能,以保护用户的数据安全。 总结来说,...

    delphi写的快速缩略图的实现,支持批量上传

    总的来说,这个项目展示了如何在Delphi环境中利用图像处理技术生成缩略图,以及如何通过HTTP协议实现批量图片上传。对于Delphi开发者,这不仅是一个实用的工具,也是一个学习和研究图像处理、网络通信、文件操作等多...

Global site tag (gtag.js) - Google Analytics