限制允许的文件上载类型PHP

时间:2010-06-10 22:52:52

标签: php validation file-upload

现在我有一个函数可以获取我上传的文件,检查扩展名,以及它是否与已处理的有效扩展数组相匹配。这是一个联系人列表导入器。

我需要弄清楚的是如何确保文件(在本例中为.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尝试过。并且服务器没有安全模式运行。

1 个答案:

答案 0 :(得分:2)

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

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

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