如何阻止假文件后缀上传?

时间:2016-01-05 11:21:46

标签: php file-upload yii2

我正面临使用Yii2框架上传文件的问题,但我认为这个问题比框架问题更深入。我有一个应用程序,允许用户上传 pdf 文件,直到这里我的应用程序工作正常,但我有一些smartass将文件扩展名从任何名称重命名为pdf。该应用程序没有验证这种技巧。

我没有成功验证 mimetype 。现在我正在寻找另一种方式。

任何人都知道如何阻止这种欺骗行为?

3 个答案:

答案 0 :(得分:1)

最好保持简单,只需使用此

<?php 
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
if(finfo_file($finfo,$filename) == 'application/pdf'){
    // input file is pdf
}
?>

既然你说它不适合你,你可以试试这些

如果您使用的是Linux服务器,则可以使用shell命令检查它们的mime类型

<?php
function detectMimeType($filename='')
{
    $filename = escapeshellcmd($filename);
    $command = "file -b --mime-type -m /usr/share/misc/magic {$filename}";

    $mimeType = shell_exec($command);

    return trim($mimeType);
}
?>

或者您可以尝试这种方法。我们假设Pdf文件以%PDF字符串开头。[通常它以%PDF开头]。

<?php
function detectFileType($filename='')
{
    $handle = fopen($filename, "rb");
    $contents = fread($handle, 4);

    fclose($handle);
    if($contents == "%PDF")
    {
        return "application/pdf";
    }
    else
    {
        return "application/octet-stream"; //unknown type
    }
}
?>

[此代码未经过测试]

请参阅这些链接,您将获得有关出错的更多信息

http://php.net/manual/en/function.mime-content-type.php

http://php.net/manual/en/ref.fileinfo.php

答案 1 :(得分:0)

最好的方法是检查mime类型的文件:

http://php.net/manual/en/function.finfo-file.php

<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
if(finfo_file($finfo,$filename) == 'application/pdf'){
    // input file is pdf
}
finfo_close($finfo);
?>

答案 2 :(得分:0)

使用mime_content_type函数解决了问题。

  

检查此处的功能php.net

此函数返回真实的mime类型。