[英]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 , 未剝離
您可以使用此字符串評估返回所需文件類型的數據。
我假設我需要檢查我正在上傳的文件的文件擴展名,對嗎?
不。
文件擴展名是“建議文件名”的任意部分,完全由用戶控制。 您應該遵循的程序是:
-
我不知道這是否是最好的解決方案,但我最終檢查了文件是否為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.