2 votes

validation du téléchargement de fichiers côté serveur - autoriser uniquement les images avec php

Un nouveau venu pose une question à laquelle il faut répondre par des solutions simples.

J'ai essayé un tas de codes. Il semble que je puisse obtenir le flux de fichiers pour getimagesize et faire fonctionner d'autres choses sans planter.

Je suis en train de dépoussiérer un vieux projet qui a besoin de limiter les fichiers téléchargés afin qu'ils ne soient que des fichiers images et rien de méchant.

Ce code me donne toujours un message d'erreur, peu importe ce que je fais.

$imageinfo = getimagesize($_FILES['bf_file'][$key]['tmp_name']);  
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') {  
alert ("Sorry, we only accept GIF and JPEG images");  
exit;  
}  

Voici l'effort de la liste noire

$blacklist = array(".php", ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py"   
,".txt", ".doc");

foreach ($blacklist as $file)
{
if(preg_match("/$file\$/i", $_FILES['bf_file'][$key]['tmp_name']))
{
alert "ERROR: Uploading executable files Not Allowed\n";
exit();
}
} 

Voici un autre getimagesize

$size = getimagesize($_FILES[bf_file][$key][tmp_name]);
$fp = fopen($_FILES[bf_file][$key][tmp_name], "rb");
if ($size && $fp) {
header("Content-type: {$size['mime']}");
fpassthru($fp);
continue;
} else
// error
alert("Inappropriate file type"); 

Sur chacun d'eux, je reçois le message d'erreur, qu'un fichier soit téléchargé ou non.

J'ai juste besoin de placer ces contrôles quelque part dans mon fichier de sorte que si le fichier téléchargé passe les contrôles, alors tout passe simplement par l'uploader et tout le reste fonctionne comme il se doit mais sans le bénéfice de ces limiteurs et contrôles.

De plus, l'utilisateur ne doit pas être obligé de télécharger un fichier. Il y a 3 champs, le sujet, le corps et le téléchargement de fichier. Seuls le sujet et le corps doivent contenir des données et cela fonctionne actuellement.

Toute aide sera grandement appréciée.

Merci,

James

1voto

Baba Points 49157

Votre script est un exemple de tout ce qui se passe.

$imageinfo = getimagesize($_FILES['bf_file'][$key]['tmp_name']);

Pour obtenir un nom temporaire, il faut $_FILES['bf_file']['tmp_name'][$key] et aussi la taille du fichier est déjà retournée via $_FILES['bf_file']['size'][$key]

Pourquoi ne pas jeter un coup d'œil à un exemple détaillé sur une question similaire ?

téléchargement d'images multiples quantité erronée sur le téléchargement de fichiers

Téléchargement d'images à l'aide de tableaux et erreurs de récupération (fetch)

1voto

xfix Points 2890

Dans le premier extrait. Bien, getimagesize() renvoie effectivement le type MIME (contrairement à ce que dit Baba), mais vous ne devriez pas en dépendre. Il est tout à fait possible de créer un fichier qui, au début, ressemble à ceci PNG GIF (une raison de bloquer PNG ?), mais après l'en-tête a <?php dangerous_code(); ?> . Aussi, je ne sais pas ce que vous essayez de faire avec [$key] . Je ne sais pas ce qu'il fait et le tableau ressemble à $_FILES[$form_name][$file_field] (par exemple $_FILES['file_input']['tmp_size'] . Il n'y a pas de troisième champ. À moins que vous ne fassiez des téléchargements de fichiers multiples, alors regardez ce que Baba a dit (c'est une fonction très peu pratique). Ensuite, PHP ne dispose pas de alert() - vous vouliez probablement dire echo .

Dans le deuxième extrait, je vois que tu fais des choses incorrectes. Le point est un caractère méta dans les expressions régulières, mais dans ce cas, cela n'a pas vraiment d'importance. Les approches par liste noire sont de toute façon imparfaites car vous ne savez pas si votre serveur ne supporte pas .php5 par exemple. Et même si ce n'est pas le cas, quelqu'un peut abuser négociation de contenu dans Apache en rendant le fichier hack.php.fr (Apache pense que .fr est une langue). Votre approche est défectueuse - donnez simplement des fichiers PNG .png quelle que soit l'extension d'origine et ainsi de suite.

Dans le troisième exemple, vous activez la mauvaise variable - mais aussi vous utilisez des mots nus (vous ne devriez pas, bien que je sois conscient que vous devriez avoir les constantes en majuscules (donc contrairement à ce que dit PHP, les mots nus ne sont pas si dangereux si vous avez du bon sens), ils sont extrêmement lents, beaucoup plus lents que les chaînes normales et font beaucoup d'erreurs si vous avez E_NOTICE (indice : vous devriez)). Suivant, continue n'est pas pour if les conditionnels - c'est pour les conditionnels de boucle (cela fonctionne aussi sur les switch (comme break ), mais je suppose que c'est juste pour la cohérence).

Quant à ne pas avoir à télécharger des fichiers, c'est facile. Il suffit de faire du conditionnel sur isset($_FILES['file_input_name']) .

en résumé - Apprendre correctement le PHP

0voto

BenLanc Points 1236

L'approche la plus sûre, et de loin, est d'empêcher votre serveur Web d'exécuter des éléments dynamiques dans des dossiers que l'utilisateur peut télécharger entièrement. Ensuite, ce qu'il télécharge n'a pas d'importance.

Un fichier .htaccess dans votre répertoire d'uploads contenant php_flag engine off empêchera le php. Les autres éléments exécutables devraient être désactivés par défaut de toute façon, mais vous devez absolument vérifier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X