请问如何判断上传文件的类型?以及图片文件的大小

countstars 2007-03-26 06:57:22
非$_FILE["upload_file"]["type"],不信任浏览器提供的Mime类型。
图片文件长和宽可以用getimagesize取得,但是有时候这个函数失效,不知道为什么,请问如何正确取得?

多谢
...全文
1849 点赞 收藏 33
写回复
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruanchao 2007-09-22
GetImageSize
取得图片的长宽。

语法: array getimagesize(string filename, array [imageinfo]);

返回值: 数组

函数种类: 图形处理




内容说明


本函数可用来取得 GIF、JPEG 及 PNG 三种 WWW 上图片的高与宽,不需要安装 GD library 就可以使用本函数。返回的数组有四个元素。返回数组的第一个元素 (索引值 0) 是图片的高度,单位是像素 (pixel)。第二个元素 (索引值 1) 是图片的宽度。第三个元素 (索引值 2) 是图片的文件格式,其值 1 为 GIF 格式、 2 为 JPEG/JPG 格式、3 为 PNG 格式。第四个元素 (索引值 3) 为图片的高与宽字符串,height=xxx width=yyy。可省略的参数 imageinfo 用来取得一些图片的相关信息,例如 IPTC (http://www.xe.net/iptc) 的 APP13 标记,就可以加在图片中,可利用 iptcparse() 来解析。

回复
cuidenghong123 2007-09-22
截取文件的后缀
回复
geimagesize
$_FILE["upload_file"]["type"]都可以
你说了,高手可以自己写客户端,发送木马上来,但是有一点,你怎么去执行这个web sell
如果你有能力通过客户端把.jpg 改成 .php 这是什么,这是对服务器目录有操作权限了,除非web管理员开放了php 的 rename服务,否则想通过web方式你无论如何也改不了,改不了就永远都不能执行。

你说你拿下其它洞洞,再来改,我看那也没有这个必要上传啦,所以说php是较安全的呢!
回复
countstars 2007-09-19
嗯,geimagesize 是正解,结帖
回复
fredyj 2007-04-25
可以去查一下 getimagesize 的源码。

getimagesize 好像也是判断文件的头,如果文件头被篡改,就得不到。

-------------------

你觉得如何才能说某一个文件是一张图片呢?
改了文件头,它就是一个图片文件了,只不过算是损坏的图片文件

=========================================================

同意
回复
zeroleonhart 2007-04-20
可以去查一下 getimagesize 的源码。

getimagesize 好像也是判断文件的头,如果文件头被篡改,就得不到。

-------------------

你觉得如何才能说某一个文件是一张图片呢?
改了文件头,它就是一个图片文件了,只不过算是损坏的图片文件
回复
fxs_2008 2007-04-20
学习了
刚查了一下手册
getimagesize 在php5以上返回数组
key[0] 宽
key[1] 长
key[2] 文件类型

本函数不需打开GD扩展
回复
fredyj 2007-04-20
可以去查一下 getimagesize 的源码。

getimagesize 好像也是判断文件的头,如果文件头被篡改,就得不到。
回复
zeroleonhart 2007-04-20
再说一次,getimagesize函数可以取得图像文件的类型,不知道的请去翻手册


某天搞到了你网站的web shell,就可以把后缀改回来,再执行这个程序了.

---------------------
搞到了web shell,并且能改文件,还需要再利用这个漏洞吗
回复
懒得去死 2007-04-20
关注。。。
回复
an9ryfr09 2007-04-19
楼主不信任Mime类型是有原因的.那些靠文件后缀来判断类型的方法统统pass.
我这里有个*.exe文件,我把后缀改了成txt,就能骗过你的检验程序上传成功,虽然没法立刻执行,但当我某天搞到了你网站的web shell,就可以把后缀改回来,再执行这个程序了.
回复
透明的人 2007-04-19
//取文件后缀
function file_type_suffixal($file_type_suffixal){
return "." . strtolower(array_pop(explode(".",$file_type_suffixal)));
}
回复
透明的人 2007-04-19
//判断上传文件时候合法
function file_suffixal($file_suffixal,$file_size = 0){
global $my_file;
if(!file_size_big($file_size)){
switch ($my_file->file_type_suffixal($file_suffixal)){
case ".jpg": break;
case ".gif": break;
case ".bmp": break;
case ".png": break;
case ".txt": break;
case ".xls": break;
case ".doc": break;
default:
echo "<script language=javascript>alert('上传的文件类型不正确');history.back(-1);</script>";
die();
break;
}
}
}

//判断上传文件大小
function file_size_big($file_size_big){
if(($file_size_big <= 0) or ($file_size_big > 1048576)){
echo "<script language=javascript>alert('请选择要上传的文件或文件应在2M以内');history.back(-1);</script>";
die();
}
}
回复
countstars 2007-04-19
up
回复
willko 2007-04-17
只能通過文件格式判斷了。。
不過好像很難。。。````
回复
ai_ni 2007-04-17
我的就使用上传的文件名的 后缀 来判断
是不是有很大的安全问题?
-------------------------------------
up!
回复
li1229363 2007-04-16
php自己写函数绝对可以达到的。我就有这样的代码。不过那得回家才能给你噢~现在是没有的
回复
an9ryfr09 2007-04-16
刚想说$_FILE["filename"]["type"]...
文件类型可以用$_FILE["filename"]来截断文件名获取后缀的方法判断类型.不过这也不值得信任.
这似乎要从PE文件格式来下手了.
回复
daidai118 2007-04-16
if ($photo != "")
{
$file_postfix = substr($p,strrpos($p,"."));
if (!in_array($file_postfix,$FILE_POSTFIX)) //判断扩展名字
{
echo "<script language='javascript'>alert('图片格式不对!');window.history.back();</script>";
}
else
{
$fp = fopen($photo,"r");
$data = addslashes(fread($fp,filesize($photo)));
}
}
回复
zhys9 2007-04-15
我的就使用上传的文件名的 后缀 来判断
是不是有很大的安全问题?

==============================
up~
回复
发动态
发帖子
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
社区公告
暂无公告