Array
(
[attachment] => Array
(
[name] => test.txt
[type] => text/plain
[tmp_name] => D:\xampp\tmp\php51C0.tmp
[error] => 0
[size] => 40
)
)
我们再来看下相关的浏览器发送的http post请求(一些可选的头部我省略了):
复制代码 代码如下:
POST /upload.php HTTP/1.1
Host:
Referer:
multipart/form-data; boundary=---------------------------24464570528145
Content-Length: 234
-----------------------------24464570528145
Content-Disposition: form-data;; filename="test.txt"
Content-Type: text/plain
360weboy
360days
Life Of A Web Boy
-----------------------------24464570528145--
从上面的请求格式中有几个字段我们要关注下的,分别是name, filename以及Content-Type.它们分别表示上传文件框在form表单中的字段名-attachment,用户从本地硬盘中上传的文件名 – test.txt,以及上传的文件格式 – text/plain(代表文本文件)。然后,我们看到一行空行下面的,就是这个上传文件中的具体内容。
二、安全性的加强
为了加强文件上传中的安全性,我们需要检查下$_FILES全局数组中的tmp_name和size。为了确保tmp_name指向的文件确实是刚刚用户在客户端上传的文件,而不是指向的类似/etc/passwd,可以使用php中的函数is_uploaded_file()来进行下判断:
复制代码 代码如下:
$filename = $_FILES['attachment']['tmp_name'];
if (is_uploaded_file($filename)) {
/* 是一个上传的文件. */
}
某些情况下,用户上传文件后,可能会将上传成功的文件的内容显示给用户看下,那么上述代码的检查尤其重要。
另外一个需要检查的就是上传文件的mime-type, 也就是上述upload.php中输出数组的type字段。 我在第一个例子中上传的是一个图片,所以$_FILES['attachment']['type']的值为'image/jpeg'。 如果打算在服务器端只接受image/png, image/jpeg, image/gif, image/x-png 以及 image/p-jpeg这些mime-type的图片,可以用类似下面的代码了进行检查(只是举个例子,具体代码,比如报错等,应该遵循你的系统中的机制):
复制代码 代码如下:
$allow_mimes = array(
'image/png',
'image/x-png',
'image/gif',
'image/jpeg',
'image/pjpeg'
);
$image = $_FILES['attachment'];
if(!in_array($image['type'], $allow_mimes)) {
die('对不起, 你上传的文件格式不准确;我们只接受图片文件.');
}
// 继续处理上传的图片文件
正如你看到的,我们已经保准了文件的mime-type是符合服务器端的要求的。但是,这样是不是就可以防止恶意用户上传其它有害文件,还是不够的,因为这个mime-type恶意用户是可以伪装的。 比如用户做了一张jpg图片,在图片的元数据中写入了一些恶意的php代码,然后保存为后缀名为php的文件。当这个恶意文件上传的时候,将顺利通过服务器端对于mime-type的检查,被认为是一张图片,里面的危险的php代码将会被执行。具体的图片的元数据类似如下:
复制代码 代码如下: