choklata Posté 4 Décembre 2006 Posté 4 Décembre 2006 salut je veut que l'utilisateur l'ors de upload de fichier ne peut ajouter que les fichier (*.doc) et je ne sait pas comment. et voici le code d'upload : <?if(isset($_POST['upload'])){ $fileName = $_FILES['userfile']['name']; $tmpName = $_FILES['userfile']['tmp_name']; $fileSize = $_FILES['userfile']['size']; $fileType = $_FILES['userfile']['type']; $fp = fopen($tmpName, 'r'); $content = fread($fp, $fileSize); $content = addslashes($content); fclose($fp); if(!get_magic_quotes_gpc()) { $fileName = addslashes($fileName); } /* connection a une base mysql en local */$connect = mysql_connect("localhost","root","");/* selection de la base de donnée mysql */mysql_select_db("instabase", $connect); $query = "INSERT INTO upload (name, size, type, content ) ". "VALUES ('$fileName', '$fileSize', '$fileType', '$content')"; mysql_query($query) or die('Error, query failed'); //include 'library/closedb.php'; echo "<br>File $fileName uploaded<br>";} ?> quelqu'un peut m'aider?
Cygnus Posté 4 Décembre 2006 Posté 4 Décembre 2006 (modifié) Bonsoir ! Tout d'abord, il faut que tu récupères l'extension du fichier soumis. Comme ceci : $typeFichier = $_FILES['userfile']['type'];$extension = strrchr($fileName, "."); Puis tu indiques les types de fichier acceptés. Comme j'en ai plusieurs, j'utilise un tableau : $auth_ext = array(".doc",".pdf",".rtf",".txt"); Et enfin, tu compares l'extension du fichier envoyé avec le tableau contenant la liste des extensions autorisées : function isExtAuthorized($ext){ global $auth_ext; if(in_array($ext,$auth_ext)){ return true; }else{ return false; }} Et tu termines par une vérification lors de la soumission du formulaire : if ((!empty($userfile)) && (!(isExtAuthorized($extension)))){ // l'extension n'est pas valide $msg_err="Seuls les fichiers doc, pdf, rtf et txt sont acceptés";} Voilà... J'espère que cela t'aidera Modifié 4 Décembre 2006 par Cygnus
FrenchFred Posté 4 Décembre 2006 Posté 4 Décembre 2006 (modifié) Mon dieu ! c'est la pire erreur a faire: verifier l'extension d'un fichier pour en definir le type. Je te conseille d'utilise http://www.php.net/manual/fr/function.mime-content-type.php. choklata, Je me permets au passage de te donner une documentation sur l'upload de fichier en php: http://www.php.net/manual/fr/features.file-upload.php Tu trouveras entre autre un systeme de gestion d'erreur, Modifié 4 Décembre 2006 par FrenchFred
Cygnus Posté 4 Décembre 2006 Posté 4 Décembre 2006 ... Bon, je crois qu'il ne me reste plus qu'à modifier mon système d'upload alors... Mais dis-moi FrenchFred, en quoi cette méthode est-elle catastrophique ?
FrenchFred Posté 4 Décembre 2006 Posté 4 Décembre 2006 (modifié) Si je renomme un fichier .exe en .doc je pourrais facilement uploader le fichier en contournant la verification de l'extension. Mais c'est plutot d'ordre general. il est impossible de faire confiance a l'extension d'un fichier pour en determiner le type exacte. C'est une regle de principe. EDIT Modérateur : Merci de ne pas donner le moyen de contourner une protection. Modifié 5 Décembre 2006 par Portekoi
Cygnus Posté 4 Décembre 2006 Posté 4 Décembre 2006 Si je renomme un fichier .exe en .docje pourrais facilement uploader le fichier en contournant la verification de l'extension. Je suis bien d'accord avec toi sur ce point. Ca me rassure un petit peu : Je croyais qu'il s'agissait d'une faille de sécurité. Cependant, avec la fonction mime-content-type comment vérifie-t-on le type de fichiers ? En vérifiant si le type retourné est égal à celui qui est recherché, c'est bien ça ?
FrenchFred Posté 4 Décembre 2006 Posté 4 Décembre 2006 c'est exacte Beh c'est une faille de securite qui est du au developpeur !!! Consulte la page relative a cette fonction. tu trouveras quelques informations complementaires et des exemples
baboon Posté 5 Décembre 2006 Posté 5 Décembre 2006 Bonjour, FrenchFred : c'est la pire erreur a faire: verifier l'extension d'un fichier pour en definir le type. Je te conseille d'utiliser http://www.php.net/manual/fr/function.mime-content-type.php Je ne vois pas ce que la vérification dans le fichier mime amène comme sécurité supplémentaire !!! Le type retourné par la fonction sera au format MIME, tout simplement... Exemple : Pour l'extension ".TXT" la fonction retoune "text/plain"... Pour le script d'upload, et le filtre mis en place, l'on doit donc tester le type au lieu de l'extension ... et en terme de sécurité, c'est du pareil au même me semble t il : Dans la mesure ou la fonction mime_content_type se base aussi sur l'extension du fichier, pour donner une correspondance mime, qu'elle est la différence en terme de sécurité dans le script d'upload d'effectuer ce test (sur le type mime), par rapport à celui que propose Cygnus ? (test sur l'extension) Désolé, mais je n'ai pas su voir cette différence ... Trés bonne journée
froidure_nicolas Posté 5 Décembre 2006 Posté 5 Décembre 2006 (modifié) Je suis tout à fait d'accord avec Baboon. Tu ne pourra jamais enpêcher l'envoi d'un .exe modifié en .png par exemple. Ta méthode est la bonne, à part le fait que d'après ce que j'ai vu, tu récupères le type de fichier avec $_FILES['myfile']['type']; Or, cette variable contient le type mime annoncé par le navigateur qui envoie la requête et, dans la réalité, il peut être différent. Vérifier l'extension est la bonne solution car l'essentiel, c'est qu'il n'y ait pas d'extensions du genre .php ou autre qui permettrai d'éxecuter du code sur le serveur après l'envoi d'un fichier. Un fichier .php renommé en .png n'est plus d'aucune utilité. Modifié 5 Décembre 2006 par froidure_nicolas
FrenchFred Posté 5 Décembre 2006 Posté 5 Décembre 2006 (modifié) Petite explication de texte: Prenons trois fichiers - fichier.php: Ce fichier est un simple script avec comme code: <?php echo 'Hello world'; ?> - fichier2.doc: Ce fichier est le precedent mais j'ai renomme l'extension en .doc - fichier.doc : Celui ci est un fichier cree avec MS word (en fait j'utilise OpenOffice) Voici un test pour chacun des fichiers avec la fonction mime_content_type: echo mime_content_type('fichier.php'); // retourne text/plainecho mime_content_type('fichier2.doc'); // retourne text/plainecho mime_content_type('fichier.doc'); // retourne application/msword Donc la fonction mime_content_type retourne le veritable mime du fichier et non par en fonction de l'extension ! Pour ce qui est de l'upload il en va de meme. Voici le resultat de la variable de téléchargement de fichier $_FILES pour chacun des fichiers precedents: fichier.php: [template_file] => Array ( [name] => fichier.php [type] => text/plain ...) fichier2.doc: [template_file] => Array ( [name] => fichier2.doc [type] => application/msword ...) fichier.doc: [template_file] => Array ( [name] => fichier.doc [type] => application/msword ...) Donc la fonction mime_content_type est la seule a retourne le correct mime type du fichier. L'habit ne fait pas le moine Modifié 5 Décembre 2006 par FrenchFred
froidure_nicolas Posté 5 Décembre 2006 Posté 5 Décembre 2006 Dis ça à mon BBComposer qui envoie du PNG/GIF/JPEG reconnu comme du application/octet-stream avec la variable $_FILES['myfile']['type']; .....
FrenchFred Posté 5 Décembre 2006 Posté 5 Décembre 2006 Beh c'est pour cela qu'il faut utiliser la fonction "mime_content_type" Le contenu de la variable $_FILES est incorrect. elle semble se baser sur le mime fournit via le protocole HTTP et non celui du filesystem. Je dis cela, c'est valable dans les quelques versions de php que j'utilise.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant