Aller au contenu

upload dans la base de mysql


choklata

Sujets conseillés

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?

Lien vers le commentaire
Partager sur d’autres sites

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é par Cygnus
Lien vers le commentaire
Partager sur d’autres sites

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é par FrenchFred
Lien vers le commentaire
Partager sur d’autres sites

...

Bon, je crois qu'il ne me reste plus qu'à modifier mon système d'upload alors...

:shutup:

Mais dis-moi FrenchFred, en quoi cette méthode est-elle catastrophique ?

:unsure:

Lien vers le commentaire
Partager sur d’autres sites

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é par Portekoi
Lien vers le commentaire
Partager sur d’autres sites

Si je renomme un fichier .exe en .doc

je 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 ?

:wacko:

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é par froidure_nicolas
Lien vers le commentaire
Partager sur d’autres sites

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/plain
echo mime_content_type('fichier2.doc'); // retourne text/plain
echo 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é par FrenchFred
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...