正在关注该线程: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上将如何显示?
答案 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)
我假设我需要检查正在上传的文件的文件扩展名,对吗?
否。
文件扩展名是“建议的文件名”的任意部分,该文件名完全在用户的控制下。您应该遵循的步骤是:
-
答案 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>";
}