getimagesize()函数(引荐进修:PHP编程从入门到通晓)
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); }
限于篇幅上面隐蔽了一些细节,如今从上面的代码中我们晓得两件事变就够了:
终究处置惩罚的函数是 php_getimagesize_from_stream
担任推断文件范例的函数是 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推断图片是不是存在的细致内容,更多请关注ki4网别的相干文章!