php 深入文件上传,深入显出PHP下的文件上传

POST /upload.php HTTP/1.1

Host: www.360weboy.me

Referer: http://www.360weboy.me/

multipart/form-data; boundary=---------------------------24464570528145

Content-Length: 234

?

-----------------------------24464570528145

Content-Disposition: form-data; name="attachment"; 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代码将会被执行。具体的图片的元数据类似如下:

File name ? ?: image.jpg

File size ? ?: 182007 bytes

File date ? ?: 2012:11:27 7:45:10

Resolution ? : 1197 x 478

Comment ? ? ?:

我们可以看到,在图片元数据的Comment字段中加入了php代码。所以,很显然,为了防止类似危险情况发生,还必须对上传文件的扩展名进行一次必要的检查。下面的代码对前面的检查Mime-type的代码进行了加强:

$allow_mimes = array(

? ? 'image/png' => '.png',

? ? 'image/x-png' => '.png',

? ? 'image/gif' => '.gif',

? ? 'image/jpeg' => '.jpg',

? ? 'image/pjpeg' => '.jpg'

);

$image = $_FILES['attachment'];

if(!array_key_exists($image['type'], $allow_mimes )) {

? ? die('对不起, 你上传的文件格式不准确;我们只接受图片文件.');

}

// 获取略去后缀名的文件名:

$filename = substr($image['name'], 0, strrpos($image['name'], '.'));

// 添加后缀名

$filename .= $allow_mimes[$image['type']];

// 继续处理上传的文件

通过上述的代码,我们确保即使上传的图片的元文件中包含了php代码的话,图片文件会被重名为后缀名为图片格式的文件,所以其中的php代码也不会被执行了。上述代码对正常的上传的图片也不会有任何负面影响。

进行了上述的几步提高安全性的检查步骤后,如果你只是要把上传的文件保存到一个指定的目录中,那么就可以使用php的默认函数move_uploaded_file来实现了:

?

$tmp_filename = $_FILES['attachment']['tmp_name'];

$filename = '/path/to/attachment.txt';

?

if (move_uploaded_file(tmp_filename, $filename)) {

? ? /* $temp_filename 保存在临时目录中的上传文件, 然后成功将其保存到对应目录下的attachment.txt文件中. */

}

?

?>

你也许还要对上传文件的大小进行限制,那么你可以通过filesize函数来获取上传文件的大小,进行判断后做进一步处理,这具体就不在这将了,自己去折腾吧。

?

相关文章

相关视频

网友评论

文明上网理性发言,请遵守 新闻评论服务协议我要评论

47d507a036d4dd65488c445c0974b649.png

立即提交

专题推荐064df72cb40df78e80e61b7041ee044f.png独孤九贱-php全栈开发教程

全栈 100W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

7dafe36c040e31d783922649aefe0be1.png玉女心经-web前端开发教程

入门 50W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

04246fdfe8958426b043c89ded0857f1.png天龙八部-实战开发教程

实战 80W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

php中文网:公益在线php培训,帮助PHP学习者快速成长!

Copyright 2014-2020 https://www.php.cn/ All Rights Reserved | 苏ICP备2020058653号-1e6cebb680dfe320dad7e62bd6442c3a6.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值