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)