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浏览器测试一下,看看返回内容。
我截了两个图,看看我标红框的地方。
看清楚了吧,返回值不一样,问题就来了。
原因是什么呢?原因就是不同的浏览器定义的不同文件类型的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>
看看效果你就明白了。
好了,上传图片的时候使用getimagesize来判断就对了,先把$_FILES函数的type先摈弃吧。
建议图片的话使用文件扩展名+getimagesize的mime来判断
其他文件的话使用文件扩展名+$_FILES函数的type来判断,但是我先一般情况可能只要开放图片上传就可以了。






#1
