Php 如何限制上载的文件仅接受zip文件?
大家早上好。我已经创建了两个php文件,它们成功地将文件上传到我的服务器。一个文件是我的网站名为upload.php的可视部分,另一个是名为upload_file.php的上传文件部分。 上传我的文件的代码是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语句
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
}