【问题标题】:Restrict allowed file upload types PHP限制允许的文件上传类型 PHP
【发布时间】:2010-06-10 22:52:52
【问题描述】:

现在我有一个函数,它接收我上传的文件,检查扩展名,如果它匹配一组有效的扩展名,它就会被处理。这是一个联系人列表导入器。

我需要弄清楚的是如何确保文件(在本例中为 .csv)实际上是它所说的(例如,不是刚刚重命名为 .csv 的 excel 文件)。

我们的服务器运行 PHP 5.2.13

这是我目前拥有的验证功能

public static function validateExtension($file_name,$ext_array) {
    $extension = strtolower(strrchr($file_name,"."));
    $valid_extension="FALSE";

    if (!$file_name) {
        return false;
    } else {
        if (!$ext_array) {
            return true;
        } else {
            foreach ($ext_array as $value) {
                $first_char = substr($value,0,1);

                if ($first_char <> ".") {
                    $extensions[] = ".".strtolower($value);
                } 
                else {
                    $extensions[] = strtolower($value);
                }
            }

            foreach ($extensions as $value) {
                if ($value == $extension) {
                    $valid_extension = "TRUE";
                }
            }

            if ($valid_extension==="TRUE") {
                return true;
            } else {
                return false;
            }
        }
    }

}

编辑:我现在正在尝试做

exec('file -ir '.$myFile) 

当我在终端中运行此命令时,我会得到一个可用的响应。当我通过 php 运行相同的命令时,我得到了不同的东西。任何想法为什么?我已经用 exec、passthru、shell_exec 试过了。并且服务器没有运行安全模式。

【问题讨论】:

标签: php validation file-upload


【解决方案1】:

忘记扩展检查,它不够可靠。

另外,我认为传统的 MIME 魔法嗅探在这里会失败,因为没有可用的标头(不过这只是我的猜测。)

在这种特定情况下,我认为快速浏览内容是可行的,例如阅读前十行左右。如果它们都不超过 x 字节,并且每行包含相同数量的分号(或 CSV 解析器作为分隔符使用的任何内容),那么它就是一个 CSV 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2021-01-26
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多