现在我有一个函数可以获取我上传的文件,检查扩展名,以及它是否与已处理的有效扩展数组相匹配。这是一个联系人列表导入器。
我需要弄清楚的是如何确保文件(在本例中为.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尝试过。并且服务器没有安全模式运行。
答案 0 :(得分:2)
忘记扩展检查,它不够可靠。
另外,我认为传统的MIME魔法嗅探会在这里失败,因为没有可用的标题(不过这只是我的猜测。)
在这种特殊情况下,我会说快速浏览一下内容是可行的,例如阅读前十行左右。如果它们都不超过x个字节,并且每行包含相同数量的分号(或者您的CSV解析器用作分隔符的任何分号),则它是CSV文件。