簡體   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