代码之家  ›  专栏  ›  技术社区  ›  neuroguy123

防止php上传上的mime伪造

  •  0
  • neuroguy123  · 技术社区  · 16 年前

    有没有办法防止有人在上传文件时伪造mime类型,然后运行php/exe/etc。。。

    我必须使文件上传目录可写且可执行,以便可以存储文件,但这允许任何人在上传后运行脚本。我可以做的一件事是在文件名中添加随机数据,这样他们就无法猜出后面的文件名(因为他们仍然无法从目录中读取列表)。

    我第一次在php中使用文件上传,我试图涵盖所有的安全问题。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Paul Tomblin    16 年前

    web浏览器不应访问文件上载目录。例如,不允许某人上传文件,例如“ remove_all_my_files.php http://xample.com/uploads/remove_all_my_files.php ".

        2
  •  0
  •   micahwittman    16 年前

    基本思路如下:

    function ReadAndOutputFileChunked ($filename) { 
        $chunksize = 1*(1024*1024); // how many bytes per chunk 
        $buffer = ''; 
        $handle = @fopen($filename, 'rb'); 
        if ($handle === false) { 
            return false; 
        } 
        while (!feof($handle)) { 
            $buffer = @fread($handle, $chunksize); 
            print $buffer; 
        } 
        return @fclose($handle); 
    }
    
    header("Content-type: application/octet-stream");
    ReadAndOutputFileChunked('/private/path/to/upload/files/' . $nameOfFile);
    
        3
  •  0
  •   Till    16 年前

    $_FILES 总是来自客户端,所以您要做的是接受文件并在服务器上扫描它。我建议使用 finfo ,这是一个PHP扩展,使它变得简单:

    <?php
    // example :-)
    $finfo = finfo_open(FILEINFO_MIME);
    echo finfo_file($finfo, '/path/to/your/upload/file);
    finfo_close($finfo);
    ?>
    

    如果你不喜欢程序化的,还有一个OO接口。

    file 检查。

    此外,许多人建议通过包装器提供文件。我在这一点上很纠结,这可能是一个解决方案,但它远不是理想的,因为a)文件仍然在您的服务器上,b)像这样提供文件很昂贵。

        4
  •  -1
  •   Devin Ceartas    16 年前

    在我的ApacheWeb服务器配置中,我不相信实际的文件内容决定文件是否作为脚本运行。通过匹配文件结尾来确定是将文件显示为文本还是图像格式,还是将其作为脚本运行。

    例如,apache配置文件httpd.conf中的一条指令

    AddType应用程序/x-httpd-php.php

    告诉服务器运行以.php结尾的文件,以作为php脚本运行。因此,只需确保上传的文件没有以.php结尾保存,也没有以任何其他脚本可执行文件结尾保存,也没有以任何文件结尾保存include文件。