1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[PHP]só imagens, zip e rar

Discussão em 'Web Development' iniciada por Kye, 14 de Setembro de 2008. (Respostas: 8; Visualizações: 2459)

  1. Kye

    Kye Power Member

    Código:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
    <html>
    <body>
          <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="fileForm" enctype="multipart/form-data">
            File to upload:
            <table>
              <tr><td><input name="upfile" type="file"></td></tr>
              <tr><td><input type="submit" name="submitBtn" value="Upload"></td></tr>
            </table>  
          </form>
    <?php    
        if (isset($_POST['submitBtn'])){
    
            // Define the upload location
            $target_path = "file_";
    
            // Create the file name with path
            $target_path = $target_path . basename( $_FILES['upfile']['name']); 
    
            // Try to move the file from the temporay directory to the defined.
            if(move_uploaded_file($_FILES['upfile']['tmp_name'], $target_path)) {
                echo "The file ".  basename( $_FILES['upfile']['name']). 
                     " has been uploaded";
            } else{
                echo "There was an error uploading the file, please try again!";
            }
        }
    ?>
    </body>
    isto é um sistema de upload.
    O que tenho de modificar para só deixar upar imagens(todos os tipos), rars e zips?
     
  2. MPalhas

    MPalhas Power Member

    podes usar a variavel $_FILES['upfile']['type'] que armazena o tipo de ficheiro.

    por exemplo, se for uma imagem, o type será "image/gif", "image/jpeg", etc.
    não sei qual será para os arquivos mas basta fazeres echo dessa variavel e logo vês


    ou em alternativa, podes usar a função substr() para obter os ultimos caracteres da string do nome do ficheiro, sabendo assim a extensão

    exemplo:
    PHP:
    substr("nome.rar", -3); //retorna "rar"
    mas penso que o primeira método seja mais correcto...
     
  3. geoblast

    geoblast Power Member

    Podes também validar com JS e impedir o upload se não forem essas as extensões.

    por exemplo:

    Código:
    
    function validateFile(obj,button){
        
        var extensao = new Array('jpg','jpeg','gif','png','zip','rar');
        var dot_pos = obj.value.lastIndexOf(".");
        
        var ok = 0;
        for(var i = 0; i<extensao.length;i++){
            if (obj.value.substr(dot_pos+1).toLowerCase()==extensao[i]){ok = 1}
        }
        
        if(ok == 1){
            button.disabled = false;
        }
        else {
            button.disabled = true;
        }
    
    }
    
    no html colocas

    Código:
    
    <input name="file_upload" type="file" class="textoinput" id="file_upload" onchange="validateFile(this,$('sentFile'))" size="40" />
                            
    <input type="submit" id="sentFile" name="sentFile" disabled="disabled" value="Gravar" />
    
     
  4. MPalhas

    MPalhas Power Member

    e depois qualquer um com conhecimentos de javascript escolhe um ficheiro qualquer, chega a consola javascript do firebug, escreve por exemplo isto:

    Código:
    document.form.submit()
    e pronto, está o caldo entornado.
    além de que esse exemplo, de todas as (más) validações javascript, nem é a melhor, porque apenas desactiva um botão. é apenas um "desenrasca" que ainda se ultrapassava mais facilmente

    validar com JS só se for para tentar dar um efeito bonito e não ter que recarregar a página, porque independetemente de haver ou não esse JS, a validação no servidor tem que existir sempre

    resumindo: nunca confiar no browser nem no utilizador.
     
  5. iznougud

    iznougud I quit My Job for Folding

    Concordo com o MPalhas. Analisa a extensao do ficheiro no servidor. Essa e a maneira mais facil.
     
  6. Mitnick

    Mitnick Power Member

    Eu acho que ambas as validacoes devem ser feitas.. Como e obvio que a validacao por JS nao e segura nem fiavel, mas para um utilizador bem intensionado pode evitar o recarregamento da pagina, imaginando por exemplo que o utilizador so se enganou a escolher o ficheiro..
     
  7. slack_guy

    slack_guy Power Member

    Não te fies na extensão do ficheiro para 'adivinhares' o tipo de conteúdo. Aliás, um ficheiro nem necessita de extensão.
    Infelizmente, só sabes com certeza o tipo de conteúdo de um ficheiro depois de chegar ao servidor... e nesse momento, já é (pode ser) tarde.
    Eu sonho com o dia em que os browsers vão tratar dessa validação. Ou seja, algures no código da página está definido que só queremos ficheiros do tipo "image/x-png" e o browser encarrega-se de filtrar esses documentos logo no cliente. Depois, já chega muito menos lixo ao servidor e o trabalho de validação fica um pouco mais facilitado, apesar de ser indispensável fazê-lo.

    Por que razão é que não deves confiar no utilizador? fez-te algum mal? :-P

    O ditado, que eu conheço, reza assim: "confia no utilizador, não confies no que ele faz".
     
    Última edição: 17 de Setembro de 2008
  8. MPalhas

    MPalhas Power Member

    "o" utilizador, são na verdade milhares deles.
    dentro desse há sempre aqueles que pensam "deixa-me cá alterar aquele javascript a ver o que acontece... olha crashou! que é aquilo? um erro da base de dados, os nomes das tabelas?? ora já agora deixa-me fazer um SQL injection..."

    quando deu por ela, acontece mais ou menos isto:
    mas pronto, se é para confiar no utilizador, reformulo a frase.
    confiem no utilizador, mas pensem nele com um carro numa estrada, com duplo traço continuo dos dois lados,, e uma brigada de transito a cada 20m (com semáforos se possivel). pode andar... mas sempre direitinho :P
     
  9. mcog_blaster

    mcog_blaster Power Member

    Podes armazenar os diferentes mime types num array, depois ves se
    PHP:
    $_FILES['form_file']['type']
    se encontra no array.
     

Partilhar esta Página