如何限制上传的文件仅接受zip文件?

时间:2014-04-07 09:08:07

标签: php html file-upload file-type

早上好。我创建了两个成功将文件上传到我的服务器的php文件。一个文件是我的网站名为upload.php的可视部分,另一个是名为upload_file.php的上传文件部分。 上传文件的代码是

 move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}");

这完全有效,但它允许我上传任何文件类型。因为我只想允许压缩文件夹,所以我尝试了这个if语句。

if($type=="application/zip" ){
move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}");
echo "<div id='mes'> File upload complete</div>";}
else{
echo "<div id='mes'>This file type cannot be uploaded. Only zip folders with the naming convention INITIAL.DATE.TIME are accepted</div>";
}
where $type=$_FILES['file']['type'];

但现在它不允许我上传任何文件,甚至没有压缩文件。那么我需要在if语句中添加什么才能允许上传压缩文件夹?如果你真的很好,我需要在if语句中添加什么才能允许只使用USERINITIAL.DATE.TIME或USERINITIAL / DATE / TIME命名约定的压缩文件,或者这不能完成?

3 个答案:

答案 0 :(得分:2)

您可以使用此解决方案

$fileName = strtolower($fileName);
$allowedExts = array('zip');
$extension = explode(".", $fileName);   
$extension = end($extension);
if(in_array($extension, $allowedExts))
{
   //move file to custom folder
}
  • 重要* 永远不要将mime时间用于识别文件类型,因为它会绕过篡改数据 最好的方式:
    如果要上传此文件,请将所有上传的文件移出public_html,并始终重命名文件名 因此,将上传的文件名保存到数据库中,并从一个php文件中读取文件,例如:

    read.php?ID = 5
    在你的read.php文件中,你应该得到id号并在数据库中搜索它,然后从db返回文件名并下载或用read.php文件读取这个文件。

答案 1 :(得分:0)

由于对这个主题的一些讨论,有一点奖励信息。 一般来说,确定文件实际上是否是我们想要的文件类型确实非常困难。您可以检查mime类型,可以由客户端修改。您可以检查文件扩展名,也可以由客户端修改 - 反之亦然。 您甚至可以检查文件的前几行,它通常包含某种标题,解释我们处理的文件类型。但仍然是这个文件可能会被一些邪恶的天才修改,使执行程序缓冲区溢出或利用一些使用的库,打开/查看/品尝/抛出文件。


让我们检查文件扩展名和mime。

首先,扩展名。

$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$isZipExtension = ( $extension == "zip" ? true : false );

在“$ _FILES”数组中,您有一个名为“Type”的索引。

现在,您希望将上传限制为仅接受Zip文件。 有几种类型定义了潜在的zip文件。所以让我们创建一个数组。

$zipTypes = array('application/zip', 'application/x-zip-compressed', 
'multipart/x-zip', 'application/x-compressed');

现在,让我们检查一下上传的类型是否是数组的一部分。

$isZipFile = in_array( $_FILES['file']["type"], $zipTypes );

如果文件在数组中,请执行上传过程。

if( $isZipFile && $isZipExtension) {
move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}");
echo "<div id='mes'> File upload complete</div>";
} else {
echo "<div id='mes'>This file type cannot be uploaded. Only zip folders with the naming convention INITIAL.DATE.TIME are accepted</div>";
}

一起

    $zipTypes = array('application/zip', 'application/x-zip-compressed', 
    'multipart/x-zip', 'application/x-compressed');

    $extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
    $isZipExtension = ( $extension == "zip" ? true : false );
    $isZipFile = in_array( $_FILES['file']["type"], $zipTypes );

    if( $isZipFile && $isZipExtension) {
        move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}");
        echo "<div id='mes'> File upload complete</div>";
    } else {
        echo "<div id='mes'>This file type cannot be uploaded. Only zip folders with the naming convention INITIAL.DATE.TIME are accepted</div>";
    }

希望它有所帮助。

答案 2 :(得分:0)

具有讽刺意味的是,您永远不会使用type密钥来检查上传的文件类型。这是因为该密钥的值是由客户端设置的,并且可以简单地欺骗。

您应该做的是检查文件扩展名(至少确保 服务器上没有配置良好的程序会以意想不到的方式处理上传):

$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$allowed = ['zip'];
if (in_array($ext, $allowed)) {
    // process the file
}