Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何限制上载的文件仅接受zip文件?_Php_Html_File Upload_File Type - Fatal编程技术网

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

Php 如何限制上载的文件仅接受zip文件?,php,html,file-upload,file-type,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语句

大家早上好。我已经创建了两个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($type==“应用程序/zip”){
移动上传的文件($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
回显“文件上传完成”;}
否则{
echo“无法上载此文件类型。仅接受命名约定为INITIAL.DATE.TIME的zip文件夹”;
}
其中$type=$\u FILES['file']['type'];

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

由于对该线程的一些讨论,这里有一些额外的信息。 一般来说,很难确定一个文件是否是我们想要的文件类型。您可以检查mime类型,该类型可以由客户端修改。您可以检查文件扩展名,客户端也可以修改文件扩展名,反之亦然。 您甚至可以检查文件的前几行,其中通常包含某种类型的头,解释我们正在处理的文件类型。但是,文件可能会被一些邪恶的天才修改,使正在执行的程序缓冲区溢出,或者利用某些使用的库来打开/查看/尝试/抛出文件


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

第一,扩展

$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$isZipExtension = ( $extension == "zip" ? true : false );
在“$\u文件”数组中,有一个名为“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>";
}
if($isZipFile&&isZipExtension){
移动上传的文件($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
echo“文件上传完成”;
}否则{
echo“无法上载此文件类型。仅接受命名约定为INITIAL.DATE.TIME的zip文件夹”;
}
全部

    $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>";
    }
$zipTypes=array('application/zip','application/x-zip-compressed',
“multipart/x-zip”、“application/x-compressed”);
$extension=pathinfo($\u FILES['file']['name'],pathinfo\u扩展名);
$isZipExtension=($extension==“zip”?true:false);
$isZipFile=在数组中($\u FILES['file'][“type”],$zipTypes);
如果($isZipFile&$isZipExtension){
移动上传的文件($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
echo“文件上传完成”;
}否则{
echo“无法上载此文件类型。仅接受命名约定为INITIAL.DATE.TIME的zip文件夹”;
}

希望有帮助。

您可以使用此解决方案

$fileName = strtolower($fileName);
$allowedExts = array('zip');
$extension = explode(".", $fileName);   
$extension = end($extension);
if(in_array($extension, $allowedExts))
{
   //move file to custom folder
}
  • 重要的* 千万不要在mime时间使用标识文件类型,因为它会绕过篡改数据。
    最佳方式:
    当您想要上传文件时,请将您所有上传的文件移到非公开html中,并始终重命名文件名。
    因此,将上传的文件名保存到数据库中,并从一个php文件中读取文件,例如:

    read.php?id=5
    在read.php文件中,您应该获取id号并在数据库中搜索它,然后从db返回文件名,并使用read.php文件下载或读取此文件

讽刺的是,您永远不应该使用
type
键来检查正在上载的文件的类型。这是因为该密钥的值是由客户机设置的,可以进行简单的欺骗

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


信任媒体类型是一个坏主意,因为客户端可以欺骗它。如果他们这样做了,他们还可以选择文件扩展名。至少如果你只是在白名单上检查一下扩展名,他们就不能选择他们喜欢的扩展名了。我宁愿两者兼而有之。文件扩展名欺骗可能同样有害。这不起作用。当我尝试上载压缩文件时,它会转到else。您也没有提到命名约定受到限制。您是否检查了“文件类型”数组索引的输出?正如其他人指出的,您还应该检查文件扩展名。或者,至少要确保添加扩展名。@Jonasm:我真的不明白你的意思。检查媒体类型有什么意义?即使它满足了你的要求,你也一事无成。如何做这两件事比仅仅检查扩展更好呢?Jon您的代码不起作用,但引导我走上正确的道路,所以谢谢您。allowed=“zip”,if($ext==$allowed)
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$allowed = ['zip'];
if (in_array($ext, $allowed)) {
    // process the file
}