繁体   English   中英

如果文件没有扩展名,如何检查 PHP 文件上传?

[英]How to check PHP File Upload if file doesn't have extension?

关注此线程: PHP 文件上传:基于 MIME 或扩展名的验证? 我假设我需要检查我正在上传的文件的文件扩展名,对吗?

我正在尝试使用 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 检查上传表单中的文件扩展名

我可以试试:

$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 上的外观如何?

为确保文件没有扩展名,请将其与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
}

如果您使用 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]=047e67dcea785cb3139bc690aebcf0d537ef4 , 未剥离

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

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

不。

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

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

我不知道这是否是最好的解决方案,但我最终检查了文件是否为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>";
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM