WEB技术之后端技术

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

PHPer 2018-02-02 897次浏览 0条评论 0 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
    您需要登录后才可以评论。 登录 | 立即注册
    相关内容

    PHP 和时间时区相关的函数

    时区问题这个网页最清楚https://blog.csdn.net/jingtsy/article/details/80100642方法1:(最好的方法)在php.ini里加上...

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

    外网访问m6理赔系统时,在影像上传时提示,IE已经对页面进行了修改,以帮助阻止跨站脚本。影像上传...

    IE如何取消阻止跨站脚本

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

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

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

    ​UCStar 聊天记录存在哪里

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

    公司内网浏览器设置问题

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

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

    WEB技术

    什么是WEB技术?下面会分前端技术和后端技术分别探讨。20180203未完待续。

    WEB技术之前端技术

    WEB技术之后端技术

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

    WEB应用与手机APP

    Android相关

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

    互联网相关

    互联网相关内容

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

    互联网相关

    你记录一些互联网相关的问题 20200323
    推荐内容

    怎样使用V2Ray代理和SSTap玩如魔兽世界/绝地求生/LOL台...

    在网上找的ss+SSTap的方式都不能通过SSTap的链接测试。最后找到了v2ray+SSTap的方式。 注意事项,首先单独有v2ray看能不能正常上网。另外加速时要v2ray和SST...

    使用V2Ray的mKCP协议加速游戏

    当前脚本已发布新版本,地址: https://github.com/kuoruan/shell-scripts/raw/master/kcptun/kcptun.sh 旧仓库已废...

    v2rayN已停止工作

    要安装.NET Framework 4.6 或者更高版本

    超省心游戏加速:Wireguard+udp加速(CentOS版)--(

    Wireguard+udpspeeder+udp2raw游戏加速方案 ---------------------------------------错误报告及解决-----------...

    wireguard+udpspeeder+udp2raw多用户配置

    Wireguard+udpspeeder+udp2raw游戏加速方案改进版-实测有效

    解决'nmake' 不是内部或外部命令,也不是可运行的程序

    在用gifsicle时,需要在其src目录下使用 nmake -f Makefile.w32 命令,报错 'nmake' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 于是网...