用户上传a.jpg文件,文件内容实际为php代码,会不会有安全问题?如果有,如何防止?

php中文网
发布: 2016-06-06 20:48:47
原创
1795人浏览过

用户上传a.jpg文件,文件内容实际为php代码,会不会有安全问题?如果有,如何防止?

回复内容:

用户上传a.jpg文件,文件内容实际为php代码,会不会有安全问题?如果有,如何防止?

设置 mimetype

有风险,判断文件头是不完全的。你可以参看

http://zone.wooyun.org/content/5429

立即学习PHP免费学习笔记(深入)”;

你需要在服务端禁止执行这些代码。简单的说,就是不管他的扩展名是什么,反正这个目录是静态的,不要丢改cgi之类的东西。

如果你是虚拟主机环境,你可能面临对主机环境无法深度配置的问题。
如果你想求个放心,我建议把这些用户上传的静态文件,托管到又拍云、七牛云等外部的CDN服务器上去。
放到外边去就不可能(也不用关心)有php会被意外执行的安全问题了。对于虚拟主机跑得起来的小站,花费也不多甚至几近免费。


10-23补充:想到一个正面突破的好办法。

用户上传之后,存储成任意安全的扩展名(例:raw、bin等)。在需要调用的时候,通过一个php脚本作为中间层传递文件内容(读取请求的文件名,找到文件,把图片文件类型对应的MIME写入HTTP头,图片文件实际的内容写入HTTP正文)。

例如:http://example.com/attach.php?id=13776
也可以用一种更加优雅的语法:http://example.com/attach.php/13776.jpg
http://example.com/attach.php/13776
甚至动用rewrite实现类似http://example.com/attach/13776的URL。

这样会收到若干好处:

  1. 绝对安全。所有的恶意代码都绝对不经执行,通过HTTP原样返回浏览器,给攻击者个自讨没趣。
  2. URL显而易见,符合REST原则,外人无法从URL猜测程序的目录结构。
  3. 经过PHP,就方便实现鉴权、防盗链等若干实用功能。
  4. 保持网址恒定性,无论是程序目录结构修改,还是静态文件将来托管到CDN上,网址都保持不变。

据我所知 原来有个漏洞,如果目录名是 a.php 然后目录里的 a.jpg 会被当作 PHP 执行。

寻光
寻光

阿里达摩院寻光视频创作平台,以视觉AIGC为核心功能,用PPT制作的方式创作视频

寻光 240
查看详情 寻光

直接上图片处理,gd或者imagick等,重新存一下

用图形库验证一下。不是图片不让上传。

当 nginx 搭配 php-cgi 时候,在路径解析问题上可能要防下。当年争议比较大的就是 cgi.fix_pathinfo 的问题。另外当nginx 处于反代模式时。mimetype 设置的对,应该没什么问题。

如果是Nginx的话可以考虑区分jpg和php的文件夹,即使上传了jpg但是路径不对也不会被执行0.0

chmod 0444 a.jpg
登录后复制

禁止文件执行

gd库获取一下图片的长宽大小,为0阻止。

很简单,检测文件头,如果不是规定的类型就删除。

以下为摘抄自网络的代码示例。

<?php   

function file_type($filename)
{
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
    $fileType = '';
    switch ($typeCode)
    {
        case 7790:
            $fileType = 'exe';
            break;
        case 7784:
            $fileType = 'midi';
            break;
        case 8297:
            $fileType = 'rar';
            break;        
        case 8075:
            $fileType = 'zip';
            break;
        case 255216:
            $fileType = 'jpg';
            break;
        case 7173:
            $fileType = 'gif';
            break;
        case 6677:
            $fileType = 'bmp';
            break;
        case 13780:
            $fileType = 'png';
            break;
        default:
            $fileType = 'unknown: '.$typeCode;
    }

    //Fix
    if ($strInfo['chars1']=='-1' AND $strInfo['chars2']=='-40' ) return 'jpg';
    if ($strInfo['chars1']=='-119' AND $strInfo['chars2']=='80' ) return 'png';

    return $fileType;
}

echo file_type('start.php');   // 6063 or 6033
登录后复制

摘自:http://justcoding.iteye.com/blog/891241241

相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号