Page 1 sur 1

Code d'upload

Posté : 25 avr. 2021, 08:37
par publiphobe
Bonjour à tous,

j'ai un code PHP qui fonctionne très bien, qui consiste à uploader une image sur un site. Par contre, depuis que je lui ai ajouté une fonction qui vérifie qu'il n'y a pas la chaîne de caractère "<?" dans le fichier, le code ne s’exécute plus. Et je ne parviens pas à comprendre d'où vient l'erreur.

Voici le code complet.

Code : Tout sélectionner

<?php // Vérifier si le formulaire a été soumis if($_SERVER["REQUEST_METHOD"] == "POST"){ // Vérifie si le fichier a été uploadé sans erreur. if(isset($_FILES["photo"]) && $_FILES["photo"]["error"] == 0){ $allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png"); $filename = $_FILES["photo"]["name"]; $filetype = $_FILES["photo"]["type"]; $filesize = $_FILES["photo"]["size"]; $tmp_name = $_FILES["photo"]["tmp_name"]; // Vérifie qu'il n'y pas pas la chaine "<?" dans le contenu du fichier $photo = file_get_contents($tmp_name); if (mb_strpos($photo, "<?") !== FALSE) die("Pourquoi mettre du code dans une image ?"); // Vérifie l'extension du fichier $ext = pathinfo($filename, PATHINFO_EXTENSION); if(!array_key_exists($ext, $allowed)) die("Erreur : Veuillez sélectionner un format de fichier valide."); // Vérifie la taille du fichier - 5Mo maximum $maxsize = 5 * 1024 * 1024; if($filesize > $maxsize) die("Error: La taille du fichier est supérieure à la limite autorisée."); // Vérifie le type MIME du fichier if(in_array($filetype, $allowed)){ // Vérifie si le fichier existe avant de le télécharger. if(file_exists("upload/" . $_FILES["photo"]["name"])){ echo $_FILES["photo"]["name"] . " existe déjà."; } else{ move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $_FILES["photo"]["name"]); echo "Votre fichier a été téléchargé avec succès."; } } else{ echo "Error: Il y a eu un problème de téléchargement de votre fichier. Veuillez réessayer."; } } else{ echo "Error: " . $_FILES["photo"]["error"]; } } ?>
Si l'un d'entre vous a une idée, je suis preneur.

Merci beaucoup,

Re: Code d'upload

Posté : 25 avr. 2021, 14:00
par @rthur
le code ne s’exécute plus. Et je ne parviens pas à comprendre d'où vient l'erreur.
C'est à dire "il ne s'exécute plus", quel est le message d'erreur ?
A quel endroit il s'arrête de fonctionner comme prévu ?

Re: Code d'upload

Posté : 25 avr. 2021, 16:39
par Figuedi
J'imagine, que c'est cette ligne qui t'embete
$photo = file_get_contents($tmp_name);
if (mb_strpos($photo, "<?") !== FALSE) die("Pourquoi mettre du code dans une image ?");
et que si tu l’échappe tu n'a pas de soucis
donc toujours si j'ai bien suivi il te faut un str_replace
<?php
function didier($str)
{
    return str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars($str, ENT_NOQUOTES, "UTF-8"));
}
?>
mais bon comme d'habitude je n'en suis pas sûr

Re: Code d'upload

Posté : 25 avr. 2021, 20:50
par @rthur
A priori, si c'est un fichier uploadé, il n'y a pas de raison pour que ce soit encodé en HTML.

Re: Code d'upload

Posté : 25 avr. 2021, 20:58
par Figuedi
il a peur que quelqu'un passe du code via le nom de fichier ?

enfin je dis ça moi hein ....

Re: Code d'upload

Posté : 25 avr. 2021, 21:07
par or 1
le test ne se fait pas sur le nom du fichier mais sur le contenu du fichier. un gif peut s'afficher correctement et contenir du code php qui peut s’exécuter sur le serveur, un test pour lutter contre une possible faille de sécurité donc.

Re: Code d'upload

Posté : 25 avr. 2021, 21:35
par Figuedi
Ok donc
<?php
	$tmp_name='./toto.txt';
	//$tmp_name='./logo V03.png';
	$photo = file_get_contents($tmp_name);
	if (mb_strpos($photo, "<?") !== FALSE) die("Pourquoi mettre du code dans une image ?");
	else echo 'tout roule';
avec le logo que j'ai fait moi meme, il me retourne comme quoi y a du code dans l'image.
et si je fait tester le fichier text qui contient bien des balises, là il ne voit rien

mais bon le code en question fonctionne c'est déjà ça, je ne comprends aps ce qu'il fait mais ça c'est un autre problème