PHP - 检查文件类型

时间:2011-01-18 07:04:30

标签: php

我已经编写了一些代码来检查扩展程序的文件输入,只有在允许的情况下才通过,但它似乎无法正常工作。

我使用以下方法调用该函数:

$vcFileType = check_filetype($HTTP_POST_FILES['cv']['name'],"That filetype isnt allowed punk",array('doc','docx','pdf'));

,功能如下:

function check_filetype($file, $problem='', $types){
    $fileExt = substr($file, strrpos($file, '.') + 1);
    if(in_array($fileExt, $types)){
        show_error($problem);
    }
    return $file;
}

如果有人能告诉我哪里出错了,那就太棒了。

干杯,

4 个答案:

答案 0 :(得分:2)

if (in_array($fileExt, $types)) {
    show_error($problem);
}

“如果扩展名是允许的扩展名之一,请显示错误...”

除了这个逻辑故障:永远不要相信用户提供的文件名!
它是完全随意的,很容易伪造 尝试实际处理文件或改为find its MIME type

答案 1 :(得分:1)

确切地说,检查文件名的扩展名不是一种保存方式。例如,有人仍然可以将恶意文件隐藏在PDF文件中。

如果扩展名不正确,检查扩展名可能是初步检查的好方法,但跳过mime检查。

答案 2 :(得分:1)

看起来你只是抓住扩展的第一个字符。字符串位置+ 1。

此外,因为您正在寻找“。”的第一个实例。你的程序会破坏任何名为inc.functions.php的东西。

试试这个:

function check_filetype($file, $problem='', $types){
    $file_parts = explode(".", $file);
    $fileExt = array_pop($file_parts);
    if(in_array($fileExt, $types)){
        show_error($problem);
    }
    return $file;
}

这会根据“。”将文件名转换为数组。无论名称中有多少个,然后返回该数组的最后一个元素 - 扩展名。

答案 3 :(得分:0)

如果您使用的是Unix,则可以使用file命令:它会检查文件的内容以推断其类型。