Très important ! Problème d'upload !! ^^ [Résolu]

Signaler
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
17 février 2011
-
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
17 février 2011
-
Bonjour à tous !

Je vous écris pour un problème que je dois résoudre dans les plus bref délais, j'espère que vous pourrez m'aider !
J'ai créé un formulaire afin d'uploader un fichier ! Or, mon script plante systématique au moment ou j'upload le fichier :

if(move_uploaded_file($nomTemporaire, $DESTINATION_FOLDER.$nomFichier))
{
echo("L'upload a réussi !

");
$sql="insert into test(titre, resume, plan, document) values('".addslashes($titre)."', '".addslashes($resume)."', '".addslashes($plan)."', 'upload/$UrlDoc');";
mysql_query($sql)or die(mysql_error());
//echo(createReturnLink());
}
else
{
echo("L'upload a échoué !

");
//echo(createReturnLink());
}

Je pense que c'est dû au fait que sur le serveur en ligne ou est mon site, ne m'autorise pas l'accès au dossier upload ! Pourquoi je ne sais pas !!

<?php
require("../connect.php");

// Récupération du dossier dans lequel le fichier sera uploadé
$DESTINATION_FOLDER = "upload/";
// Taille maximale de fichier, valeur en bytes
$MAX_SIZE = 5000000;
// Récupération de l'url de retour
$RETURN_LINK = $_SERVER['HTTP_REFERER'];
// Définition des extensions de fichier autorisées (avec le ".")
$AUTH_EXT = array(".doc", ".pdf", ".jpg", ".ppt", ".xls", ".bmp", ".gif", ".docx", ".ods", ".odt");

// Fonction permettant de créer un lien de retour automatique
function createReturnLink()
{
global $RETURN_LINK;
echo "Retour
";
}

// Fonction permettant de vérifier si l'extension du fichier est autorisée.
function isExtAuthorized($ext)
{
global $AUTH_EXT;
if(in_array($ext, $AUTH_EXT))
{
return true;
}
else
{
return false;
}
}

// On vérifie que le champs contenant le chemin du fichier soit bien rempli.
if(empty($_FILES["f_document"]["name"]))
{
// Nom du fichier choisi:
$nomFichier = $_FILES["f_document"]["name"] ;
// Nom temporaire sur le serveur:
$nomTemporaire = $_FILES["f_document"]["tmp_name"] ;
// Type du fichier choisi:
$typeFichier = $_FILES["f_document"]["type"] ;
// Poids en octets du fichier choisit:
$poidsFichier = $_FILES["f_document"]["size"] ;
// Code de l'erreur si jamais il y en a une:
$codeErreur = $_FILES["f_document"]["error"] ;
// Extension du fichier
$extension = strrchr($nomFichier, ".");

// Si la taille du fichier est supérieure à la taille
// maximum spécifiée => message d'erreur
if($poidsFichier < $MAX_SIZE)
{
// On teste ensuite si le fichier a une extension autorisée
if (!in_array($extension,$AUTH_EXT))
{
// Ensuite, on copie le fichier uploadé ou bon nous semble.
if(move_uploaded_file($nomTemporaire, $DESTINATION_FOLDER.$nomFichier))
{
echo("L'upload a réussi !

");
$sql="insert into test(titre, resume, plan, document) values('".addslashes($titre)."', '".addslashes($resume)."', '".addslashes($plan)."', 'upload/$UrlDoc');";
mysql_query($sql)or die(mysql_error());
//echo(createReturnLink());
}
else
{
echo("L'upload a échoué !

");
//echo(createReturnLink());
}
}
else
{
echo ("Les fichiers avec cette extension $extension ne peuvent pas être uploadés !
");
//echo (createReturnLink()."
");
}
}
else
{
$tailleKo = $MAX_SIZE / 1000;
echo("Vous ne pouvez pas uploader de fichiers dont la taille est supérieure à : $tailleKo Ko.
");
//echo (createReturnLink()."
");
}
}
else
{
echo("Vous n'avez pas choisi de fichier !
");
//echo (createReturnLink()."
");
}
?>

Voici l'intégralité de mon code, j'espère que vous pourrez m'aider rapidement, car c'est assez urgent !! Merci d'avance !!

^^

18 réponses

Messages postés
78
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
17 février 2011
1
Après avoir pris le temps de tout reprendre à zéro je suis parvenue à réaliser un code d'upload correct qui fonctionne très bien !
Je vais donc vous en faire profiter !!

<?php
require('../connect.php');

$max_size=$_POST["max_file_size"];
$titre=$_POST["txt_titre"];
$entete=$_POST["txt_entete"];
$resume=$_POST["txt_resum"];
$plan=$_POST["source"];
$matiere=$_POST["s_mat"];

if($_FILES['up_document']['error']>0)
{
echo "<script>alert("Erreur lors du transfert")</script>";
echo "<script>location.replace("zadmin.php?page=saisieintermediaire")</script>";
}
else
{
if($_FILES['up_document']['size']>$max_size)
{
echo "<script>alert("Le fichier est trop gros")</script>";
echo "<script>location.replace("zadmin.php?page=saisieintermediaire")</script>";
}
else
{
$extensions_valides = array("doc", "pdf", "ppt", "xls", "docx", "ods", "odt", "pptx", "xlsx");
$extension_upload = strtolower( substr( strrchr($_FILES['up_document']['name'], '.') ,1) );
if ( in_array($extension_upload,$extensions_valides) )
{
$nom = md5(uniqid(rand(), true));

$nom = "upload/".$_FILES['up_document']['name'];
$resultat = move_uploaded_file($_FILES['up_document']['tmp_name'],$nom);
if ($resultat)
{
$sql="insert into devoirs (TitreDev, EnteteResumDev, ResumeDev, PlanDev, CheminAcces, CodeMat) values ('".addslashes($titre)."','".addslashes($entete)."','".addslashes($resume)."', '".addslashes($plan)."', '$nom', $matiere);";
mysql_query($sql)or die(mysql_error());
echo "<script>alert("Transfert réussi")</script>";
echo "<script>location.replace("zadmin.php?page=saisieintermediaire")</script>";
}
else
{
echo "<script>alert("echec du transfet")</script>";
echo "<script>location.replace("zadmin.php?page=saisieintermediaire")</script>";
}
}
else
{
echo "<script>alert("extension non valides")</script>";
echo "<script>location.replace("zadmin.php?page=saisieintermediaire")</script>";
}
}
}
?>
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
12
Ca plante ?? mais quel est le message d'erreur ??
S.
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
17 février 2011
1
Justement c'est là qu'est mon problème ! Il ne m'affiche pas de message d'erreur !
Je pense qu'il n'arrive pas pas à faire le :

if(move_uploaded_file($nomTemporaire, $DESTINATION_FOLDER.$nomFichier))

et me renvoi systématique l'echo que j'ai mis dans le else de cette condition (en rouge dans le sujet) !! C'est pour sa, je dois avouer que là je suis larguer et que j'ai besoin d'aide ! ^^
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
12
Dans ces cas là, l'erreur 'vient de toi'.. puisqu'il n'y a pas de message d'erreur.. LOL !!
essaie la méthode bourrin serein..
move_uploaded_file($_FILES["f_document"]["tmp_name"],'/tmp/toto.txt'))
et tu mets ton /tmp en 777 pour être sur que tout le monde puisse écrire, a fortiori ton process Apache..
Autre piste: peut etre un SAFE_MODE capricieux en fonction des versions d'Apache.
S.
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
17 février 2011
1
Merci pur ta réponse mais je n'est bien saisie tout ce que tu as dit !!
Certe je viens d'avoir mon diplôme, mais ce dont tu me parle (tmp, 777) je ne vois pas du tout ce que c'est ! Ensuite, si j'ai bien compris, je doit mettre dans un fichier text un document que j'aurais uploader, c'est-à-dire des fichiers qui peuvent aussi bien être des .doc, .xls, .ppt ?? Peux-tu m'en dire d'avantage s'il te plaît ??
Merci en tout cas pour ton aide !! ^^
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
12
tu es sur Linux ou Windows ??
pour le toto.txt, c'était un exemple. Le type nous est indifférent..
S.
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
17 février 2011
1
je suis actuellement sous windows 7 titan !! Le but étant que cela marche en ligne bien évidemment !! ^^
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
12
Avant que ça marche en ligne ça doit déja marcher chez toi. Donc teste avec
move_uploaded_file($_FILES["f_document"]["tmp_name"],'C:\toto.txt'))
Et vérifie si tu as bien un fichier toto.txt dans ton C: après exécution de ton script..
Par contre opur la mise en prod il te faudra connaitre l'environnement.. ET le maitriser un minimum..
S.
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
17 février 2011
1
Bon j'ai tester en suivant ton conseil !
Désormais, il me dit que ma variable est indefini sur plusieurs lignes !
Celles-ci :

$nomFichier = $_FILES["f_document"]["name"] ;

$nomTemporaire = $_FILES["f_document"]["tmp_name"] ;

$typeFichier = $_FILES["f_document"]["type"] ;

$poidsFichier = $_FILES["f_document"]["size"] ;

$codeErreur = $_FILES["f_document"]["error"] ;

ainsi qu'à cette ligne :

if(move_uploaded_file($_FILES["f_document"]["tmp_name"],'C:\toto.txt'))

Cela veut donc dire qu'il ne trouve pas le fichier que j'ai sélectionné !
Alors questions, dans mon code initial, dois-je appeler cette variable par la méthode post du fait que le input est dans un formulaire, ou est-ce que mon code est bon et c'est autre chose qui cloche ??

Pour plus de clarté, voici les messages d'erreurs que j'obtient :

Notice: Undefined index: f_document in C:\wamp\www\diane_gareodevoir\zone_administration\devoir_exec.php on line 38

Notice: Undefined index: f_document in C:\wamp\www\diane_gareodevoir\zone_administration\devoir_exec.php on line 40

Notice: Undefined index: f_document in C:\wamp\www\diane_gareodevoir\zone_administration\devoir_exec.php on line 42

Notice: Undefined index: f_document in C:\wamp\www\diane_gareodevoir\zone_administration\devoir_exec.php on line 44

Notice: Undefined index: f_document in C:\wamp\www\diane_gareodevoir\zone_administration\devoir_exec.php on line 46

Notice: Undefined index: f_document in C:\wamp\www\diane_gareodevoir\zone_administration\devoir_exec.php on line 59
L'upload a échoué !
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
12
tu es sur d'avoir mis les bons arguments dans ta balise <form> ??
par acquis de concience fais un var_dump($_FILES); après ton POST. Ca permettra de savoir si tu récupères bien la variable..
S.
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
Salut,

Afin de résoudre ton problème :
if(empty($_FILES["f_document"]["name"]))

doit être remplacé par :
if(!empty($_FILES["f_document"]["name"]))


Dans le même genre :
if (!in_array($extension,$AUTH_EXT)) 

doit être remplacé par :
if (in_array($extension,$AUTH_EXT)) 

Ce serait bête de n'autoriser l'upload que des extensions non autorisés hein ? :)

Au passage tu es en lice pour la palme de la fonction la plus useless grâce à tes fonctions isExtAuthorized() et createReturnLink() qui, en plus de ne servir à rien et posent un potentiel risque d'effets de bords, ne sont jamais appelée dans ton code.
J'en profite également pour dire qu'avec certaines versions du serveur web nginx le premier venu peut exécuter le script PHP de son choix. Je n'ai que passé un rapide coup d'œil mais ça me semble contenir bien d'autres failles de sécurité (en tout cas ce qui est certain est que, combiné à d'autres erreurs fréquentes dans le reste du code, ça peut en poser de très graves également).
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
17 février 2011
1
D'accord merci pour l'info !
A titre informatif, j'ai adapter le code d'un script trouvé sur le net car le mien ne marchait pas à la base non plus ! Je crois que je vais reprendre depuis le début, en évitant les problèmes que tu as mis en avant et en essayant les astuces que ma donné l'autre intervenant, une fois la solution trouvé, je la mettrais sur ce sujet !! ^^
Merci pour les infos, je vous tiens au courant !! ^^
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
12
j'avoue n'avoir même pas lu le code.. je suis parti du principe suivant: les fondamentaux sont ils bons ? NONNN.. donc ne lis pas plus et résous déja ça. LOLL !!
S.
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
17 février 2011
1
En fait je crois avoir compris mon problème !
Je n'appel pas ma variable par la méthode post ! Je pense qu'il est là mon principal souci !! Il y a vraiment des fois, je ne suis pas attentif à ce que je fais !! Je vais vérifié et si c'est sa je mettrais réponse accepté !! ^^
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
j'ai adapter le code d'un script trouvé sur le net

Sur le net on trouve de tout et n'importe quoi, et malheureusement surtout du grand n'importe quoi.
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
12
Sur le net.. j'aime bien trouver des tuto que tu peux casser via les commentaires.. LOL !! voila pourquoi j'en fais pas.. LOL !!
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
25
Salut,

je suis parvenue à réaliser un code d'upload correct qui fonctionne très bien !

Je ne voudrais pas faire mon rabat joie, mais "correct" est quelque peu exagéré !

J'ai lu en transversal, mais :
- le renvoi de JS n'est vraiment pas top
- tu as toujours des problèmes de sécurité important.
Il est possible d'uploader un fichier plus gros que la taille que tu fixes (sous réserve de la config PHP)
Il est peut être possible de réaliser une injection SQL, ou en tout cas d'obtenir des infos importantes sur ta requête en la faisant planter.

$nom md5(uniqid(rand(), true));> ne sert à rien puisque $nom est redéfinie après

Sans doute y a t-il d'autres choses.

Cordialement,

Kohntark -
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
17 février 2011
1
Certe il n'est pas parfait, mais il fonctionne très bien, donc il est correct !! ^^
Merci pour l'info tout de même, quant à la sécurité, de quoi parles-tu exactement ??
Qu'est-ce qui pourrait être améliorer ?? N'hésite pas, je suis officielement diplomé d'informatique mais néanmoins je ne suis pas un hyper pro du php et j'ai toujours soif d'apprendre de nouvelles choses !! ^^

Cordialement !!