2014-10-29 30 views
0

我正在寻找最安全的方式来确定用户已发送到我的服务器的文件的扩展名。 我知道我不应该相信窗体发送的图像文件。 我会在将它移动到我的上传目录之前,从我的tmp文件开始猜测它。最安全的方式来猜测文件扩展名

谢谢

+0

[PHP检查文件扩展名]的可能重复(http://stackoverflow.com/questions/7563658/php-check-file-extension) – Kasyx 2014-10-29 13:57:13

+0

有没有明确的方式来获得扩展名,但使用MIME -type可能是你最好的选择,如果'SplFileInfo :: getExtension'被证明是不可靠的 – 2014-10-29 14:12:51

回答

1

可以使用pathinfo功能此类似:

$file = "a.jpg"; 
var_dump(pathinfo($file)); 

将会有一个扩展的关键。 但我建议你不只是验证文件的扩展名,但也是MIME类型!

+0

由tmp文件上的pathinfo返回的扩展是'tmp',这不是我所需要的... – rudak 2014-10-29 14:06:45

+1

@rudak你可以使用函数在文件名上,而不是临时文件名。 – Alternatex 2014-10-29 14:07:43

+0

这个名字可以是假的,我觉得这个不是很安全 – rudak 2014-10-29 14:09:36

0

我发现这个方法:

public static function is_image($image_path) 
{ 
    if (!$f = fopen($image_path, 'rb')) { 
     return false; 
    } 

    $data = fread($f, 8); 
    fclose($f); 

    $unpacked = unpack("H12", $data); 
    if (array_pop($unpacked) == '474946383961' || array_pop($unpacked) == '474946383761') 
     return "gif"; 
    $unpacked = unpack("H4", $data); 
    if (array_pop($unpacked) == 'ffd8') 
     return "jpg"; 
    $unpacked = unpack("H16", $data); 
    if (array_pop($unpacked) == '89504e470d0a1a0a') 
     return "png"; 

    return false; 
} 

你怎么看呢? thx

+0

所以我只需要转储8任意字节然后添加'<?php eval(gzinflate(base64_decode($ malware)));'并且您拥有。 – 2014-11-04 22:09:37