WEB技术之后端技术

getimagesize 函数的使用-中文文件名问题-getimagesize 函数不是完全可靠的

PHPer 2018-02-02 1917 0 0
在用getimagesize处理中文名图片时报错。failed to open stream: No such file or directory in D:\AppServ\www\img.php on line...

在用getimagesize处理中文名图片时报错。

failed to open stream: No such file or directory in D:\AppServ\www\img.php on line 4


网上查也一下没找到是不是getimagesize不支持中文,我是在windows上执行代码的

网上查了下,可以这样,把文件名重命名,然后再用getimgesize函数

$filename='测试001.jpg';
$newFileName='ceshi001.jpg';
rename(iconv('UTF-8','GBK',$filename), iconv('UTF-8','GBK',$newFileName));
$filename=$newFileName;
$image=__DIR__.DIRECTORY_SEPARATOR.$filename;
$imageInfo=getimagesize($image);

OK了,下面是转载内容,文章名:getimagesize 函数不是完全可靠的

以下是转载https://segmentfault.com/a/1190000003911296


getimagesize 函数并不属于 GD 扩展的部分,标准安装的 PHP 都可以使用这个函数。可以先看看这个函数的文档描述:http://php.net/manual/zh/function.getimagesize.php

如果指定的文件如果不是有效的图像,会返回 false,返回数据中也有表示文档类型的字段。如果不用来获取文件的大小而是使用它来判断上传文件是否是图片文件,看起来似乎是个很不错的方案,当然这需要屏蔽掉可能产生的警告,比如代码这样写:

<?php
$filesize = @getimagesize('/path/to/image.png');
if ($filesize) {
    do_upload();
}
# 另外需要注意的是,你不可以像下面这样写:
# if ($filesize[2] == 0)
# 因为 $filesize[2] 可能是 1 到 16 之间的整数,但却绝对不对是0。

但是如果你仅仅是做了这样的验证,那么很不幸,你成功的在代码里种下了一个 webshell 的隐患。

要分析这个问题,我们先来看一下这个函数的原型:

static void php_getimagesize_from_stream(php_stream *stream, zval **info, INTERNAL_FUNCTION_PARAMETERS)
{
    ...
    itype = php_getimagetype(stream, NULL TSRMLS_CC);
    switch( itype) {
        ...
    }
    ...
}
static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) {
    ...
    php_getimagesize_from_stream(stream, info, INTERNAL_FUNCTION_PARAM_PASSTHRU);
    php_stream_close(stream);
}
PHP_FUNCTION(getimagesize)
{
    php_getimagesize_from_any(INTERNAL_FUNCTION_PARAM_PASSTHRU, FROM_PATH);
}

限于篇幅上面隐藏了一些细节,现在从上面的代码中我们知道两件事情就够了:

  1. 最终处理的函数是 php_getimagesize_from_stream
  2. 负责判断文件类型的函数是 php_getimagetype

接下来看一下 php_getimagetype 的实现:

PHPAPI int php_getimagetype(php_stream * stream, char *filetype TSRMLS_DC)
{
    ...
    if (!memcmp(filetype, php_sig_gif, 3)) {
        return IMAGE_FILETYPE_GIF;
    } else if (!memcmp(filetype, php_sig_jpg, 3)) {
        return IMAGE_FILETYPE_JPEG;
    } else if (!memcmp(filetype, php_sig_png, 3)) {
        ...
    }
}

去掉了一些细节,php_sig_gif php_sig_png 等是在文件头部定义的: ...

立即注册
分享的网址网站均收集自搜索引擎以及互联网,非查问网运营,查问网并没有提供其服务,请勿利用其做侵权以及违规行为。

更新于:2018-02-02 20:37:40
内容很赞,打赏我
    您需要登录后才可以评论。 立即注册
    相关内容

    在太保工作中遇到的互联网以及内网问题记录

    IE如何取消阻止跨站脚本

    电销三期打印要安装PageOn的问题

    一些公司网址浏览器兼容性问题

    网址打开页面显示不全,增值税管理系统页面显示不全

    ​UCStar 聊天记录存在哪里

    内网用UcStar聊天记录文件存放路径

    公司内网浏览器设置问题

    各种应用安装包括驱动程序都要内网的管理员账号才能安装

    绿联USB声卡虚拟7.1驱动-绿联官网地址

    WEB技术

    WEB技术之前端技术

    WEB技术之后端技术

    WEB应用转手机APP,手机APP制作平台推荐

    WEB应用与手机APP

    Android相关

    2017 年 Web 开发工程师技术发展路线图

    互联网相关

    2008年通过互联网领袖扑克牌看中国互联网形势

    互联网相关

    推荐内容

    分享几个好用的bt搜索bt资源下载网址网站

    影视电影剧集动漫综艺bt资源在线播放网址网站推荐分享

    全网最新bt磁力搜索引擎bt资源bt网站网址分享

    怎样使用V2Ray代理和SSTap玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩...

    sstap游戏代理教程 从此玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩虹六...

    使用V2Ray的mKCP协议加速游戏

    v2rayN已停止工作