Pergunta

No site do PHP, a única verdadeira verificação eles sugerem está usando is_uploaded_file() ou move_uploaded_file(), aqui . Claro que você geralmente não quer fazer o upload do utilizador qualquer tipo de arquivo, para uma variedade de razões.

Devido a isso, muitas vezes tenho usado algum "estrita" tipo mime verificação. Claro que isso é muito falho porque muitas vezes os tipos de MIME estão errados e os usuários não podem fazer upload de seus arquivos. Também é muito fácil de falsificar e / ou alteração. E junto com tudo isso, cada navegador e sistema operacional lida com eles de forma diferente.

Outro método é verificar a extensão, o que, claro, é ainda mais fácil de mudança de tipo mime.

Se você só quer imagens, usando algo como getimagesize() vai funcionar.

E quanto a outros tipos de arquivos? PDFs, documentos do Word ou arquivos Excel? Ou texto mesmo apenas arquivos?

Editar: Se você não tem mime_content_type ou Fileinfo e system ( "-bi arquivo $ uploadedfile ") dá-lhe o tipo de arquivo errado, o que outras opções existem?

Foi útil?

Solução

Dê uma olhada mime_content_type ou Fileinfo. Estes são built-in comandos PHP para determinar o tipo de um arquivo por olhar para o conteúdo do arquivo. Além disso, verifique os comentários sobre o acima de duas páginas, existem algumas outras sugestões boas.

Pessoalmente, eu tive sorte usando algo que é essencialmente system("file -bi $uploadedfile"), mas eu não tenho certeza se esse é o melhor método.

Outras dicas

IMHO, todos os métodos de verificação MIME do tipo são inúteis.

Say você tem que deveria ter MIME-type application/pdf. métodos padrão estão tentando encontrar algo que se parece com um cabeçalho PDF (%PDF- ou smth. parecido) e eles vão voltar 'Ok, parece que este é um arquivo PDF' em caso de sucesso. Mas, na verdade isso não significa nada. Você pode fazer upload de um arquivo contendo apenas %PDF-1.4 e passará MIME-check.

Quer dizer, se o arquivo tem um tipo MIME esperado - ele vai sempre passar a verificação do tipo MIME caso contrário o resultado é indefinido

.

Eu suponho que você está indo para ter uma lista branca fixo de tipos de arquivos que você vai aceitar.

Para cada um destes tipos, você vai ter que usar diferentes técnicas para verificar se eles são exemplos válidos de que formato.

Há duas perguntas relacionadas:

  • Será que olhar mais ou menos como ele poderia ser o tipo certo? (Para JPEG, você pode verificar os cabeçalhos, como você mencionou. Para muitos formatos baseados em Unix, você pode verificar o "cookie mágico".)

  • É realmente um válido exemplo desse tipo (por exemplo, para qualquer XML-como formato, você pode validar contra um DTD).

Eu acho que, para cada formato, você deve fazer perguntas separadas para cada um, porque a resposta vai ser bastante diferente para PDFs em comparação com arquivos zip.

Eu costumava mime_content_type que é compatível com o PHP 5.2, porque eu posso usar nem Fileinfo (requer PHP 5.3), nem system(), que está desativada pelo meu provedor. Por exemplo, posso verificar se um arquivo é um arquivo de texto para:

if (strcmp(substr(mime_content_type($f),0,4),"text")==0) { ... }

Você pode ver um exemplo completo na minha "Diretório PHP e Subdirectory Listener & File Viewer e Downloader" em: http://www.galgani.it/software_repository/index.php

if(isset($_FILES['uploaded'])) {
    $temp = explode(".", $_FILES["uploaded"]["name"]);

    $allowedExts = array("txt","htm","html","php","css","js","json","xml","swf","flv","pdf","psd","ai","eps","eps","ps","doc","rtf","ppt","odt","ods");

    $extension = end($temp);
    if( in_array($extension, $allowedExts)) {
       //code....

    } else {
        echo "Error,not Documentum type...";
    }
}

Aqui é a função file_mime_type de iZend:

function file_mime_type($file, $encoding=true) {
    $mime=false;

    if (function_exists('finfo_file')) {
        $finfo = finfo_open(FILEINFO_MIME);
        $mime = finfo_file($finfo, $file);
        finfo_close($finfo);
    }
    else if (substr(PHP_OS, 0, 3) == 'WIN') {
        $mime = mime_content_type($file);
    }
    else {
        $file = escapeshellarg($file);
        $cmd = "file -iL $file";

        exec($cmd, $output, $r);

        if ($r == 0) {
            $mime = substr($output[0], strpos($output[0], ': ')+2);
        }
    }

    if (!$mime) {
        return false;
    }

    if ($encoding) {
        return $mime;
    }

    return substr($mime, 0, strpos($mime, '; '));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top