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

Messages postés
78
Date d'inscription
mardi 16 juin 2009
Dernière intervention
17 février 2011
- 31 août 2010 à 15:02 - Dernière réponse :
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Dernière intervention
17 février 2011
- 2 sept. 2010 à 19:02
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 !!

^^
Afficher la suite 

Votre réponse

18 réponses

Meilleure réponse
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Dernière intervention
17 février 2011
2 sept. 2010 à 15:27
3
Merci
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>";
}
}
}
?>

Merci WrestlingMan 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de WrestlingMan
Messages postés
2382
Date d'inscription
lundi 4 février 2002
Dernière intervention
29 décembre 2012
1 sept. 2010 à 08:34
0
Merci
Ca plante ?? mais quel est le message d'erreur ??
S.
Commenter la réponse de syndrael
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Dernière intervention
17 février 2011
1 sept. 2010 à 10:20
0
Merci
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 ! ^^
Commenter la réponse de WrestlingMan
Messages postés
2382
Date d'inscription
lundi 4 février 2002
Dernière intervention
29 décembre 2012
1 sept. 2010 à 10:39
0
Merci
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.
Commenter la réponse de syndrael
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Dernière intervention
17 février 2011
1 sept. 2010 à 11:01
0
Merci
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 !! ^^
Commenter la réponse de WrestlingMan
Messages postés
2382
Date d'inscription
lundi 4 février 2002
Dernière intervention
29 décembre 2012
1 sept. 2010 à 11:49
0
Merci
tu es sur Linux ou Windows ??
pour le toto.txt, c'était un exemple. Le type nous est indifférent..
S.
Commenter la réponse de syndrael
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Dernière intervention
17 février 2011
1 sept. 2010 à 11:53
0
Merci
je suis actuellement sous windows 7 titan !! Le but étant que cela marche en ligne bien évidemment !! ^^
Commenter la réponse de WrestlingMan
Messages postés
2382
Date d'inscription
lundi 4 février 2002
Dernière intervention
29 décembre 2012
1 sept. 2010 à 12:51
0
Merci
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.
Commenter la réponse de syndrael
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Dernière intervention
17 février 2011
1 sept. 2010 à 13:45
0
Merci
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é !
Commenter la réponse de WrestlingMan
Messages postés
2382
Date d'inscription
lundi 4 février 2002
Dernière intervention
29 décembre 2012
1 sept. 2010 à 14:22
0
Merci
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.
Commenter la réponse de syndrael
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Dernière intervention
5 juin 2013
1 sept. 2010 à 14:29
0
Merci
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).
Commenter la réponse de TychoBrahe
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Dernière intervention
17 février 2011
1 sept. 2010 à 14:39
0
Merci
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 !! ^^
Commenter la réponse de WrestlingMan
Messages postés
2382
Date d'inscription
lundi 4 février 2002
Dernière intervention
29 décembre 2012
1 sept. 2010 à 14:45
0
Merci
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.
Commenter la réponse de syndrael
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Dernière intervention
17 février 2011
1 sept. 2010 à 15:08
0
Merci
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é !! ^^
Commenter la réponse de WrestlingMan
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Dernière intervention
5 juin 2013
1 sept. 2010 à 16:22
0
Merci
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.
Commenter la réponse de TychoBrahe
Messages postés
2382
Date d'inscription
lundi 4 février 2002
Dernière intervention
29 décembre 2012
2 sept. 2010 à 08:56
0
Merci
Sur le net.. j'aime bien trouver des tuto que tu peux casser via les commentaires.. LOL !! voila pourquoi j'en fais pas.. LOL !!
Commenter la réponse de syndrael
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
2 sept. 2010 à 17:46
0
Merci
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 -
Commenter la réponse de kohntark
Messages postés
78
Date d'inscription
mardi 16 juin 2009
Dernière intervention
17 février 2011
2 sept. 2010 à 19:02
0
Merci
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 !!
Commenter la réponse de WrestlingMan

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.