【问题标题】:How to Block Fake File Suffix Uploads?如何阻止假文件后缀上传?
【发布时间】:2016-04-09 04:59:08
【问题描述】:

我在使用 Yii2 框架上传文件时遇到了问题,但我认为这个问题比框架问题更深入。我有一个允许用户上传 pdf 文件的应用程序,直到这里我的应用程序工作正常,但是当一些聪明人将文件扩展名从任何内容重命名为 pdf 时,我遇到了麻烦。该应用程序没有验证这种技巧。

我尝试验证 mimetype,但没有成功。现在我正在寻找另一种方法。

有人知道如何阻止这种作弊吗?

【问题讨论】:

  • 最可靠的方法是在php pdf库中打开文件,然后将其保存到新位置——如果不是pdf文件,pdf阅读器将失败/抛出异常。这比仅仅检查 mime 类型要多得多(正如@dev0 在上面链接的问题中提到的那样)
  • @dev0 不适合我。该应用程序不断上传。
  • @Steve 我害怕听到这个。此更改将使用户的流程更加困难。
  • 这对你来说肯定会做更多的工作,但用户不应该真正注意到 - 它会慢一点,但我想这是异步完成的(例如 ajax),所以多花一秒钟左右看到进度条显示“验证文件类型”不会有太大区别

标签: php file-upload yii2


【解决方案1】:

最好的方法是检查文件的 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】:

最好保持简单并使用它

<?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

【讨论】:

  • 谢谢,我下周末试试这个。
【解决方案3】:

问题已使用mime_content_type 函数解决。

在这里查看函数php.net

这个函数返回真正的mime类型。

【讨论】:

    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2021-08-21
    • 2020-07-08
    • 2011-08-18
    • 2013-05-06
    相关资源
    最近更新 更多