php文件上载始终上载文件,即使出现错误

php文件上载始终上载文件,即使出现错误,php,file-upload,Php,File Upload,我正在尝试将pdf或jpg、jpeg文件上载到文件夹,代码如下: //Get the uploaded file information if(!$_FILES['medreport']['error']) { $medreport = basename($_FILES['medreport']['name']); $medreport_extn = substr($medreport, strrpos($medreport, '.') + 1);//get the file e

我正在尝试将pdf或jpg、jpeg文件上载到文件夹,代码如下:

//Get the uploaded file information
if(!$_FILES['medreport']['error'])
{
    $medreport = basename($_FILES['medreport']['name']);
    $medreport_extn = substr($medreport, strrpos($medreport, '.') + 1);//get the file extension of the file
    $medreport_size = $_FILES["medreport"]["size"]/1024;//size in KBs
    $tmp_path = $_FILES["medreport"]["tmp_name"];
    $report_folder = "../reports/";

    //Settings
    $max_allowed_file_size = 200; // size in KB
    $allowed_extensions = array("jpg", "jpeg", "pdf");

    //Validations
}

if($medreport_size > $max_allowed_file_size )
{
    $error[] = "Size of the report file should be less than $max_allowed_file_size KB";
}

//Validate the file extension
$allowed_ext = false;
for($i=0; $i<sizeof($allowed_extensions); $i++)
{
    if(strcasecmp($allowed_extensions[$i],$medreport_extn) == 0)
    {
        $allowed_ext = true;
    }
}

if(!$allowed_ext)
{
    $error[] = "The uploaded report file is not a supported file type. "."Only pdf, jpg and jpeg report file types are supported. ";
}

//replace filename with unixtime
$unixtime =time();
$medreport = $unixtime.mt_rand(0,9).'.'.$medreport_extn;

$report_path = $report_folder . $medreport;
if(is_uploaded_file($tmp_path))
{
    if(!copy($tmp_path,$report_path))
    {
        $error[] = 'Error while copying the uploaded report file';
    }
}
SetHandler none
SetHandler default-handler
Options -ExecCGI
php_flag engine off

总是上传的文件让我很困惑

您没有使用刚刚发现的错误来检查是否需要继续

这:

应该是这样的:

if(count($error) === 0 && is_uploaded_file($tmp_path))

如果尚未初始化,
$error
数组,则应在开始时将其初始化为空数组。

您没有使用刚刚发现的错误来检查是否需要继续

这:

应该是这样的:

if(count($error) === 0 && is_uploaded_file($tmp_path))

如果您还没有这样做,您应该在开始时将
$error
数组初始化为空数组。

是的……您完全正确。我已经初始化了错误数组,但是我错过了计数($error)==0部分。谢谢你帮助我。我这样做安全吗??需要做什么才能使它更安全?是的……你完全正确。我已经初始化了错误数组,但是我错过了计数($error)==0部分。谢谢你帮助我。我这样做安全吗??需要做些什么才能使其更加安全?可能dir属于
www-data www-data
(所有者和组),这相当于权限掩码(75 atm)上的前2个数字。来宾用户不太可能需要对web服务器上的任何内容拥有任何权限,所以750应该这样做。安全风险实际上在于拥有一个web服务器既可以读取也可以写入的目录-但是你可以通过.htaccess文件来缓解这一风险。由于PHP在服务器上运行,所以在文件在服务器上之前,它无法知道文件是否太大,或者是不允许的文件类型-是的,它将被上传,除非它达到
upload\u max\u filesize
post\u max\u size
设置的限制,例如,在这种情况下,上传将被中止。取决于其他人的意思,通过http提供的每个文件都将由Apache发送,Apache是目录(因此也是文件)所有者。使用SFTP登录的每个人都应该在
www-data
组中,因此将具有读取权限。基本上不存在需要为web服务器上的来宾用户(即以来宾身份登录计算机)提供权限的情况。例如mydomain.com/reports/15088490982.pdf将始终给出禁止的错误。您没有在此服务器上访问/reports/15088490982.pdf的权限。对于文件,它应该可以与
640
(文件很少需要是可执行的);Apache拥有并提供该文件。当您连接到web服务器时,您正在与web服务器交谈,它是作为*nix用户运行并为文件提供服务的web服务器。我们服务器上的几乎每个目录都是750,几乎每个文件都是640-但这首先需要文件所有权正确。大概目录的所有者是
www-data www-data
(所有者和组),这相当于权限掩码(75 atm)上的前两个数字。来宾用户不太可能需要对web服务器上的任何内容拥有任何权限,所以750应该这样做。安全风险实际上在于拥有一个web服务器既可以读取也可以写入的目录-但是你可以通过.htaccess文件来缓解这一风险。由于PHP在服务器上运行,所以在文件在服务器上之前,它无法知道文件是否太大,或者是不允许的文件类型-是的,它将被上传,除非它达到
upload\u max\u filesize
post\u max\u size
设置的限制,例如,在这种情况下,上传将被中止。取决于其他人的意思,通过http提供的每个文件都将由Apache发送,Apache是目录(因此也是文件)所有者。使用SFTP登录的每个人都应该在
www-data
组中,因此将具有读取权限。基本上不存在需要为web服务器上的来宾用户(即以来宾身份登录计算机)提供权限的情况。例如mydomain.com/reports/15088490982.pdf将始终给出禁止的错误。您没有在此服务器上访问/reports/15088490982.pdf的权限。对于文件,它应该可以与
640
(文件很少需要是可执行的);Apache拥有并提供该文件。当您连接到web服务器时,您正在与web服务器交谈,它是作为*nix用户运行并为文件提供服务的web服务器。我们服务器上几乎每个目录都是750个,几乎每个文件都是640个,但这首先需要文件所有权是正确的。