pagina pessol(sou iniciante) upload de ficheiros

MCH2387

Power Member
Boas

tenho um projecto simples, quero ter uma página onde se pode fazer o upload de ficheiros para o meu servidor de SSH

é possivel?

anexo: tenho conhecimentos ao nivel do flash e o básico de HTML, PHP e SQL.
 
Podes até não usar uma base de dados, mas nesse caso terás de ter bastante cuidado, porque é catastroficamente fácil abrir buracos de segurança.
Se não quiseres usar uma base de dados, o que precisas de fazer é um script que faça o upload (ver link fornecido pelo fil79), e os ficheiros são movidos para uma pasta privada abaixo do www, isto é, à qual uma pessoa não possa aceder directamente através do browser.
Depois, precisas é de outro script para listar os ficheiros dessa pasta e permitir o download.
 
acho que já está, pelo menos funciona

no ficheiro html:
Código:
<form enctype="multipart/form-data" method="post"
        action="carrega.php">
    <input type="hidden" name="MAX_FILE_SIZE" value="100000000">
    Ficheiro a enviar: <input name="fichutil" type="file"> <br>
    <p><input type="submit" value="Enviar ficheiro">
</from>
    <p><b><h3>Lista</h3></b>

    <?php
    $lista = GetDirArray("soft");
    while (list ($par1, $par2) = each ($lista)){
        if ($par2 != "." && $par2 != ".." ){
            $pth = "soft/$par2";
            $tam = filesize($pth);
            $pth = str_replace(" ", "%20", $pth);
            echo "<p><a href = '$pth'>$par2</a> - ($tam octetos)\n";
        }
    }
    
    function GetDirArray($sPath)
    {
        $retVal = array();
        $listaDir=opendir($sPath);
        while ($fich = readdir($listaDir))
            $retVal[count($retVal)] = $fich;
        
        closedir($listaDir);
        sort($retVal);
        return $retVal;
    }
    ?>

no php:
Código:
<?php
  
  $fu = $_FILES['fichutil'];
  $ficheiro="soft/" . $fu['name'];
  
  print "<p>Nome = " . $fu['name'];
  print "<p>Tamanho = " . $fu['size'];
  
  if (!preg_match("/\'/",$fu['name']) && is_uploaded_file($fu['tmp_name'])) {
      print "<p>Ficheiro carregado. Prima voltar para confirmar.";
      $fich = str_replace(" ", "+", $fu['name']);
      move_uploaded_file($fu['tmp_name'], $ficheiro);
  } else {
      echo "<p>Algo correu mal: ficheiro '" . $fu['name'] . "'.";
  }
  ?>


há falta de segurança aqui???

obrigado
 
Última edição pelo moderador:
Provavelmente há.
Cria um ficheiro PHP chamado "teste.php" com o seguinte conteúdo:
PHP:
<?php echo "Falha detectada!<br>"; phpinfo(); ?>
depois envia-o usando esse sistema, e, considerando que tens o teu script em http://www.oteusite.com/pasta/upload.php, tenta abrir o http://www.oteusite.com/pasta/soft/teste.php.
 
Provavelmente há.
Cria um ficheiro PHP chamado "teste.php" com o seguinte conteúdo:
PHP:
<?php echo "Falha detectada!<br>"; phpinfo(); ?>
depois envia-o usando esse sistema, e, considerando que tens o teu script em http://www.oteusite.com/pasta/upload.php, tenta abrir o http://www.oteusite.com/pasta/soft/teste.php.

ok ja fiz isso, e aparece uma página cheia de infos

que posso interpretar daqui?

obrigado
 
ok ja fiz isso, e aparece uma página cheia de infos

que posso interpretar daqui?

obrigado

Que tens uma falha de segurança. É possível colocar e executar scripts no teu servidor. Esse script do kayvlim é «inofensivo», apenas revela info do servidor. Mas com outros scripts é possivel expor a bd, aceder a áreas restritas, etc...

Tens que precaver o tipo de ficheiros que podem ser colocados no servidor, precaver a sua execuação, etc..
 
Que tens uma falha de segurança. É possível colocar e executar scripts no teu servidor. Esse script do kayvlim é «inofensivo», apenas revela info do servidor. Mas com outros scripts é possivel expor a bd, aceder a áreas restritas, etc...

Tens que precaver o tipo de ficheiros que podem ser colocados no servidor, precaver a sua execuação, etc..

estou a perceber onde queres chegar, tenho de ler mais sobre isso então.
1-que tipos de ficheiros devo nao aceitar? só executáveis?
2-alguem sabe como isso se faz? é no ficheiro php que envia os dados ou no que recebe?

muito obrigado pela ajuda
 
Isso tudo depende muito do que queres fazer.
Se estás a fazer um script para uma galeria, por exemplo, então possivelmente só precisarás de aceitar imagens (que em certas circunstâncias continuarão a permitir falhas de segurança, mas isso é uma história mais complicada).
Se estás a fazer um alojamento de ficheiros, então tens de permitir tudo, incluindo scripts.

A minha solução no meu site foi:
* script upload.php mostra o formulário para o envio de ficheiros e trata do envio
* os ficheiros são movidos para a pasta ../private/ficheiros
* como medida auxiliar, também mudo os nomes dos ficheiros, de forma a evitar que existam dois ficheiros com o mesmo nome. Cada nome será único
* depois, existe um script - download.php - que conecta à base de dados, verifica se o nome introduzido corresponde a um nome de ficheiro válido, e de seguida envia os headers para forçar o download e faz um readfile() do ficheiro

Por exemplo, se eu chamar /download.php?ficheiro=abcdef, o ficheiro download.php liga-se à bd, verifica que o nome abcdef pertence ao ficheiro "teste.php", envia os headers necessários para que o browser grave o ficheiro com o nome "teste.php" e avalia a expressão
PHP:
readfile("../private/ficheiros/abcdef");
.

Desta forma, não é possível aceder directamente a um script, ainda que este seja enviado, portanto, a existirem falhas de segurança, em princípio não estarão aqui. De qualquer forma, o script upload.php está protegido por palavra-passe.

Verifica se o teu alojamento só te dá o interior do www, ou se também te permite andares um nível para trás por FTP. Se te permitir, então podes fazer um script como eu disse para evitares falhas de segurança, criando uma pasta privada fora da pasta www. Senão, é mais seguro aceitares apenas ficheiros do tipo que queres especificamente aceitar (fazes uma whitelist).

Vê estes links para informações auxiliares:
http://www.w3schools.com/PHP/php_file_upload.asp
http://www.scanit.be/uploads/php-file-upload.pdf (<- PDF)
 
Última edição:
vou explicar para quê isto tudo.
quero criar uma página apenas com o local para upload de ficheiros para que me possam enviar ficheiros quando eu não estou na disponível na net.
não é para os ficheiros ficarem lá, é para removelos logo que chegue a casa

devo interpretar pela tua userbar que és do tectico, assim como eu, e estou a usar o sistema sigma para fazer isto, e visto não podermos usar e abusar daquilo... apenas quero fazer esta coisa simples. tanto é assim que estou a pensar remover a lista que aparece na página para que ng veja o que lá está.

obrigado
 
Percebo o que queres fazer, e nunca usei o sigma para isso. No entanto, acho que o sigma te permite teres a tal pasta privada.

O que te estou a dizer é também para ires ganhando boas práticas, porque uma falha destas num site em produção é muito, muito grave.

Pensa também noutra coisa: há demasiados factores a teres em conta. Primeiro, o tamanho máximo dos ficheiros está limitado (o phpinfo que viste mostra isso tudo), e o tempo máximo que um script pode demorar também está. Assim, se alguém te enviar ficheiros muito grandes, leva com um erro, e se o ficheiro demorar demasiado tempo a chegar, idem.

Geralmente, o limite é tão pequeno que é preferível enviarem-te esses ficheiros por e-mail. Não sei quais os limites do sigma, até porque não tenho o serviço www activado, mas acredito que não sejam altos. Consulta as variáveis upload_max_filesize e max_execution_time naquele ficheiro onde viste as informações todas do PHP.
 
Geralmente, o limite é tão pequeno que é preferível enviarem-te esses ficheiros por e-mail. Não sei quais os limites do sigma, até porque não tenho o serviço www activado, mas acredito que não sejam altos. Consulta as variáveis upload_max_filesize e max_execution_time naquele ficheiro onde viste as informações todas do PHP.

no upload_max_filesize tem 10M
no max_execution_time tem 10

realmente é muito baixo o tamanho, não tinha noção disso, assim penso que isto so serviu para aprender alguma coisa... não será uma coisa a usar com frequência.

muito obrigado
 
Back
Topo