博客小子:记录我们对互联网和生活的探索! 注册 | 登陆

php的$_FILES函数中type类型的提供、伪造、安全以及实例说明

Tags: php, $_files, type, 提供, 伪造, 安全, getimagesize

php的$_FILES函数是一个很好用的函数,但是这个函数的type不是由php去读取文件的信息,而是由浏览器提供的。换句话说:同一个文件,使用不同的浏览器php返回的type类型是不一样的,这点在极端注意安全性的服务器上是很重要的因为,由浏览器提供type类型的话,就有可能被黑客利用向服务器提交一个type类型为图片的文件,实际上是一个php文件。

作为一个简单的实例,我们先看一个极端简单的例子

upload.php源码如下:

<?
$file=$_FILES['file'];
if(!empty($file)){
 var_dump($file);
}
?>


<form method="post" enctype="multipart/form-data" action="upload.php">
 请选择文件: <br>
<input name="file" type="file"><br>
<input type="submit" value="上传文件">
</form>

来源:www.blogguy.cn,转载请注明出处blogguy.cn,谢谢。

简单得不能再简单了,我们随便找一个图片分别用ie和firefox浏览器测试一下,看看返回内容。

我截了两个图,看看我标红框的地方。

大小: 48.25 K
尺寸: 390 x 331
浏览: 1 次
点击打开新窗口浏览全图

大小: 43.24 K
尺寸: 318 x 311
浏览: 0 次
点击打开新窗口浏览全图

看清楚了吧,返回值不一样,问题就来了。

原因是什么呢?原因就是不同的浏览器定义的不同文件类型的mime不一样,所以用这招判断文件上传是否合法是很危险的,具体不多说了。

说说解决办法吧:通常我们允许上传的文件类型一般是图片,所以如果上传图片的话请务必使用getimagesize函数来获取文件类型,下面演示了在不同浏览器上返回的结果(其实不用演示,因为getimagesize是用服务器端的php提供的,知道这点就可以了!!!)

 修改代码如下

<?
$file=$_FILES['file'];
if(!empty($file)){
 var_dump($file);
 var_dump(getimagesize($file["tmp_name"]));
}
?>

来源:www.blogguy.cn,转载请不要删掉这行!!!
<form method="post" enctype="multipart/form-data" action="upload.php">
 请选择文件: <br>
<input name="file" type="file"><br>
<input type="submit" value="上传文件">
</form>

看看效果你就明白了。

大小: 67.33 K
尺寸: 412 x 408
浏览: 0 次
点击打开新窗口浏览全图

大小: 67.12 K
尺寸: 326 x 427
浏览: 1 次
点击打开新窗口浏览全图

好了,上传图片的时候使用getimagesize来判断就对了,先把$_FILES函数的type先摈弃吧。

建议图片的话使用文件扩展名+getimagesize的mime来判断

其他文件的话使用文件扩展名+$_FILES函数的type来判断,但是我先一般情况可能只要开放图片上传就可以了。

Tags: php, $_files, type, 提供, 伪造, 安全, getimagesize

« 上一篇:我的一个数字转化为人民币大写的java例子 | 下一篇:mysql的char,varchar,text,blob的几点个人理解 »

只显示10条记录相关文章

Trackbacks

点击获得Trackback地址,Encode: UTF-8

1条记录访客评论

确实如此,检测浏览器提供的mime没什么意义。一个php文件直接更改扩展名为图片,浏览器给的结果一样是图片类型。除了文件上传应有的检测再加上扩展名和getimagesize的mime来判断就可以了。感谢分享~

Post by Rhythm on 2012, February 1, 5:37 PM 引用此文发表评论 #1


发表评论

评论内容 (必填):