如果文件不存在,如何检查PHP文件上载';你没有分机吗?

如果文件不存在,如何检查PHP文件上载';你没有分机吗?,php,Php,遵循这一思路: 我假设我需要检查我上传的文件的文件扩展名,对吗 我正在尝试使用PHP接口将make文件生成的二进制文件上载到Raspberry中 这是有问题的文件: Big_ppd_display_try1: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sh

遵循这一思路: 我假设我需要检查我上传的文件的文件扩展名,对吗

我正在尝试使用PHP接口将make文件生成的二进制文件上载到Raspberry中

这是有问题的文件:

Big_ppd_display_try1: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=047e67dcea785cb3139bc690aebcf0d537ef40fe, with debug_info, not stripped
遵循这一思路:

我可以试试:

$allowed =  array('gif','png' ,'jpg');
$filename = $_FILES['uploaded_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if(!in_array($ext,$allowed) ) {
    echo 'error';
}
但是我如何告诉PHP只允许没有文件扩展名的二进制文件,如
Big\u ppd\u display\u try1


另外,我正在从Linux机器上传。该二进制文件在Windows PC上的外观如何?

要确保该文件没有扩展名,请将其与
null
进行比较。 要检查
mime
tipe,请使用
finfo\uu
函数:

$filename=$\u文件['uploaded\u file']['name'];
$finfo=finfo\u open(FILEINFO\u MIME\u类型);
$mime=finfo_文件($finfo,$_文件['uploaded_file']['tmp_name']);
$ext=pathinfo($filename,pathinfo_扩展名);
if($ext===null&&$mime===='application/octet stream'){
//做点什么
}

要确保文件没有扩展名,请将其与
null
进行比较。 要检查
mime
tipe,请使用
finfo\uu
函数:

$filename=$\u文件['uploaded\u file']['name'];
$finfo=finfo\u open(FILEINFO\u MIME\u类型);
$mime=finfo_文件($finfo,$_文件['uploaded_file']['tmp_name']);
$ext=pathinfo($filename,pathinfo_扩展名);
if($ext===null&&$mime===='application/octet stream'){
//做点什么
}

如果您像下面这样使用linux,我们可以使用
file
命令

  $command = "file $_FILES['uploaded_file']['tmp_name']";
  shell_exec($command);
它将返回一个字符串,如

ELF 32位LSB可执行文件,ARM,EABI5版本1(SYSV),动态链接,解释器/lib/ld linux armhf.so.3,对于GNU/linux 3.2.0,BuildID[sha1]=047e67dcea785cb3139bc690aebcf0d537ef40fe,带有调试信息,未剥离


您可以使用此字符串计算返回所需文件类型的数据。

如果您使用linux,我们可以使用
file
命令,如下所示

  $command = "file $_FILES['uploaded_file']['tmp_name']";
  shell_exec($command);
它将返回一个字符串,如

ELF 32位LSB可执行文件,ARM,EABI5版本1(SYSV),动态链接,解释器/lib/ld linux armhf.so.3,对于GNU/linux 3.2.0,BuildID[sha1]=047e67dcea785cb3139bc690aebcf0d537ef40fe,带有调试信息,未剥离

可以使用此字符串计算返回所需文件类型的数据

我假设我需要检查我上传的文件的文件扩展名,对吗

没有

文件扩展名是“建议文件名”的任意部分,完全由用户控制。您应该遵循的程序是:

  • 检查文件的内容
  • 如果检测到的类型不在允许列表中,则拒绝该文件
  • 生成您自己的文件名以将其保存到:
    • 扩展名应基于步骤1中确定的文件类型
    • 名称的其余部分可能基于用户的建议,但应通过允许字符的白名单进行过滤,例如,将字母和数字以外的所有内容替换为
      -
  • 我假设我需要检查我上传的文件的文件扩展名,对吗

    没有

    文件扩展名是“建议文件名”的任意部分,完全由用户控制。您应该遵循的程序是:

  • 检查文件的内容
  • 如果检测到的类型不在允许列表中,则拒绝该文件
  • 生成您自己的文件名以将其保存到:
    • 扩展名应基于步骤1中确定的文件类型
    • 名称的其余部分可能基于用户的建议,但应通过允许字符的白名单进行过滤,例如,将字母和数字以外的所有内容替换为
      -

  • 我不知道这是否是最佳解决方案,但我最后检查了该文件是否为
    应用程序/octet流

    <?php
    
    if (isset($_POST['update_button']) && $_POST['update_button'] == 'Update') {
        if (isset($_FILES['uploaded_file']) &&
            $_FILES['uploaded_file']['error'] === UPLOAD_ERR_OK &&
            $_FILES['uploaded_file']['type'] == "application/octet-stream")
        {
            // print_r($_FILES);
            echo "<br>Successful upload !<br> ";      
        } else {
            echo "<br>File was not uploaded !<br> ";
        }
    }
    
    ?>
    
    
    
    我已经放弃了对文件扩展名或MIME类型的检查,因为我认为可以轻松绕过这些检查

    我现在尝试使用某个参数执行该文件,并检查其响应

    这是我现在正在研究的代码:

            $fileTmpPath = $_FILES['uploaded_file']['tmp_name'];
            $fileName = $_FILES['uploaded_file']['name'];
            // echo "<br>$fileTmpPath"."/$fileName<br>";
            $command = "sudo .$fileTmpPath"."/$fileName -argument";
            echo "<br>$command<br>";
    
            $response = exec($command, $full, $status);
            if($status != 0) {
                echo "<br>Something went wrong<br>";
            } else {
                echo "<br>$response<br>";
            }
    
    $fileTmpPath=$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
    $fileName=$\u文件['uploaded\u file']['name'];
    //回显“
    $fileTmpPath”。/$fileName
    ”; $command=“sudo.$fileTmpPath”。/$fileName-argument”; echo“
    $command
    ”; $response=exec($command,$full,$status); 如果($status!=0){ echo“
    出了问题
    ”; }否则{ 回声“
    $response
    ”; }
    我不知道这是否是最佳解决方案,但我最后检查了该文件是否为
    应用程序/八位字节流

    <?php
    
    if (isset($_POST['update_button']) && $_POST['update_button'] == 'Update') {
        if (isset($_FILES['uploaded_file']) &&
            $_FILES['uploaded_file']['error'] === UPLOAD_ERR_OK &&
            $_FILES['uploaded_file']['type'] == "application/octet-stream")
        {
            // print_r($_FILES);
            echo "<br>Successful upload !<br> ";      
        } else {
            echo "<br>File was not uploaded !<br> ";
        }
    }
    
    ?>
    
    
    
    我已经放弃了对文件扩展名或MIME类型的检查,因为我认为可以轻松绕过这些检查

    我现在尝试使用某个参数执行该文件,并检查其响应

    这是我现在正在研究的代码:

            $fileTmpPath = $_FILES['uploaded_file']['tmp_name'];
            $fileName = $_FILES['uploaded_file']['name'];
            // echo "<br>$fileTmpPath"."/$fileName<br>";
            $command = "sudo .$fileTmpPath"."/$fileName -argument";
            echo "<br>$command<br>";
    
            $response = exec($command, $full, $status);
            if($status != 0) {
                echo "<br>Something went wrong<br>";
            } else {
                echo "<br>$response<br>";
            }
    
    $fileTmpPath=$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
    $fileName=$\u文件['uploaded\u file']['name'];
    //回显“
    $fileTmpPath”。/$fileName
    ”; $command=“sudo.$fileTmpPath”。/$fileName-argument”; echo“
    $command
    ”; $response=exec($command,$full,$status); 如果($status!=0){ echo“
    出了问题
    ”; }否则{ 回声“
    $response
    ”; }
    $ext==null假定任何没有扩展名的文件都可以工作。但他只想要二进制文件,我觉得这对我没什么帮助。我不想让用户上传任何类型的文件。$ext===null假设任何没有扩展名的文件都可以工作。但他只想要二进制文件,我觉得这对我没什么帮助。我不想让用户知道