[英]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.