这个问题在这里已有答案:
目前在我的代码中,在将文件上传到服务器之前检查文件的扩展名。在将文件上传到服务器之前,我还需要检查文件的内容。我使用了以下代码
$FileName = $_FILES[$imageInput]['name']; $finfo = finfo_open(FILEINFO_MIME_TYPE); $mtype = finfo_file($finfo, $FileName);
为所有图像类型(如.png,.jpg)正确识别$ mtype,但它无法识别.sh文件。我该如何使用php检查?有人请帮忙。
您可以阻止通过.htaccess
执行的各种文件。例如,您可以放置它
<FilesMatch "\.(sh|cgi.+)$">
ForceType text/plain
</FilesMatch>
这将确保文件夹中的文件将以text / plain格式返回
如果需要,可以在检测到图像时检测mime类型。 .sh
的哑剧类型是
application/x-sh
application/x-csh
text/x-shellscript
在这种情况下,您可以通过以下脚本获取扩展名,尝试在mime类型和扩展名之间进行交叉验证:
$fileExtension= end(explode(".", $_FILES["uploadedFile"]["name"]));
要么
$fileName = ($_FILES['uploadedFile']['name']);
$fileExtension = pathinfo($fileName , PATHINFO_EXTENSION);
然后,应用以下内容:
$finfo = new finfo(FILEINFO_MIME_TYPE);
if (false === $fileExtension = array_search(
$finfo->file($_FILES['uploadedFile']['tmp_name']),
array(
//'sh' => 'text/x-shellscript', //not allowed
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'rtf' => 'text/rtf',
'odt' => 'application/vnd.oasis.opendocument.text',
'txt' => 'text/plain',
'pdf' => 'application/pdf',
),
true
)) {
$error .= "<br> The allowed file format file are: \"doc\", \"docx\", \"rtf\", \"odt\", \"txt\", \"pdf\"' ";
}
我遇到了类似的问题,但在我的情况下,文件是.rtf
类型。
FILEINFO_MIME_TYPE
函数显然无法捕获任何类型的文件扩展名,这可能会导致一些验证错误。
一些例子:.rtf文件的默认mime类型是application/rtf
,但FILEINFO_MIME_TYPE
函数显示text/rtf
。
我浪费了很多时间试图解决这个错误,因为我描述了它here:
在.sh
文件的情况下,我注意到FILEINFO_MIME_TYPE
函数无法捕获扩展名,它返回一个空值