使用php [duplicate]阻止将.sh文件上传到服务器

问题描述 投票:0回答:2

这个问题在这里已有答案:

目前在我的代码中,在将文件上传到服务器之前检查文件的扩展名。在将文件上传到服务器之前,我还需要检查文件的内容。我使用了以下代码


    $FileName = $_FILES[$imageInput]['name'];
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mtype = finfo_file($finfo, $FileName);

为所有图像类型(如.png,.jpg)正确识别$ mtype,但它无法识别.sh文件。我该如何使用php检查?有人请帮忙。

php
2个回答
0
投票

您可以阻止通过.htaccess执行的各种文件。例如,您可以放置​​它

<FilesMatch "\.(sh|cgi.+)$">
    ForceType text/plain
</FilesMatch>

这将确保文件夹中的文件将以text / plain格式返回

如果需要,可以在检测到图像时检测mime类型。 .sh的哑剧类型是

application/x-sh
application/x-csh
text/x-shellscript

0
投票

在这种情况下,您可以通过以下脚本获取扩展名,尝试在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函数无法捕获扩展名,它返回一个空值

© www.soinside.com 2019 - 2024. All rights reserved.