如果文件没有扩展名,如何检查PHP File Upload?

时间:2019-10-01 12:53:22

标签: php

正在关注该线程:PHP file upload: mime or extension based verification? 我假设我需要检查正在上传的文件的文件扩展名,对吗?

我正在尝试使用PHP接口将生成文件产生的二进制文件上传到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

正在关注该线程:php check file extension in upload form

我可以尝试:

$allowed =  array('gif','png' ,'jpg');
$filename = $_FILES['uploaded_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if(!in_array($ext,$allowed) ) {
    echo 'error';
}

但是如何告诉PHP只允许没有文件扩展名的二进制文件(如Big_ppd_display_try1

此外,我正在从Linux计算机上进行上传。该二进制文件在Windows PC上将如何显示?

4 个答案:

答案 0 :(得分:0)

要确保文件没有扩展名,请与null进行比较。 要检查mime提示,请使用finfo_函数:

$filename = $_FILES['uploaded_file']['name'];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['uploaded_file']['tmp_name']);
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if ($ext === null && $mime === 'application/octet-stream') {
    //do something
}

答案 1 :(得分:0)

如果您像下面这样使用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 ,带有debug_info,未剥离

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

答案 2 :(得分:0)

  

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

否。

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

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

答案 3 :(得分:0)

我不知道这是否是最好的解决方法,但是我最终检查了文件是否为application/octet-stream

<?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>";
        }