Vérifier le type mime d'un fichier

Vous avez un soucis de développement et ce n'est pas du ressort de notre support ? N'hésitez pas à soumettre vos petits soucis de développement et à vous entre aider par la même occasion.
Nside
Messages : 82
Inscription : 24 septembre 2011 à 00:05

Bonjour,

Je possède un site d'hébergement d'image en autre, maintenant un problème s'oppose à moi.

Chaque utilisateurs peuvent récupérer avec un simple code tout ce qui se trouve sur mon site, en écrivant un code PHP et en mettant l'extension .jpg ou autre extension accepter par mon script.

Je sais qu'il est possible de contrer cela en vérifiant le mime du fichier, maintenant je ne sais pas du tout comme m'y prendre.

Merci, de votre aide.
Didier07
Messages : 291
Inscription : 15 mai 2011 à 09:44

Avatar de l’utilisateur
Elodie
Fondatrice / Responsable
Fondatrice / Responsable
Messages : 7938
Inscription : 2 avril 2010 à 20:14

Un conseil également :

Ne pas vérifier le type MIME du fichier juste après le POST car on peut l'usurper également. Il faut enregistrer le fichier sur le disque dans le répertoire temporaire et seulement après, vérifier son type MIME par son nom de fichier.

Le mieux également est de chercher la taille du fichier image, ainsi si ce n'est pas une véritable image, la taille sera de 0 et on peut même obtenir le type MIME de l'image via cette méthode par la même occasion :

Code : Tout sélectionner

$size = getimagesize($_FILES['uploaded']['tmp_name']);
  $fp = fopen($_FILES['uploaded']['tmp_name'], "rb");
  if ($size && $fp)
    {
    if( substr($size['mime'], 0, 6) != 'image/' )
      {
      echo("Le fichier envoyé n'est pas une image.");
      }else{
      if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target))
        {
        echo "<p>The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded</p>";
        }else{
        echo "Sorry, there was a problem uploading your file.";
        }
      }
    }else{
    echo("Le fichier envoyé n'est pas une image.");
    }
  }
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Nside
Messages : 82
Inscription : 24 septembre 2011 à 00:05

J'ai du mal à comprendre quelque chose.

Dans le truc 'image/', faut que j'écrive le nom du dossier ? C'est ce que j'ai fait... Sauf qu'il m'indique toujours que le fichier envoyer n'est pas une image.

Ensuite ou "rb" il correspond à quoi ?

Merci, :)
Inconnu
Cet utilisateur a supprimé son compte et n’existe plus.
Messages : 6340
Inscription : 29 décembre 2010 à 18:15

rb pour droits en lecture binaire
Et pour image/ , il ne faut pas le remplacer, ce n'est pas un répertoire, c'est le début du type MIME image , ex : image/png.
En fait, getimagesize() te renvoie un tableau contenant différentes infos, notamment à l'index 'mime' le type MIME de ton image.
En filtrant les 6 premières lettres, tu obtiens normalement "image/" ce qui englobe tous les types d'image.
Nside
Messages : 82
Inscription : 24 septembre 2011 à 00:05

A ok d'accord merci.
Inconnu
Cet utilisateur a supprimé son compte et n’existe plus.
Messages : 6340
Inscription : 29 décembre 2010 à 18:15

De rien.
Ensuite concernant ton problème, je ne suis pas sur d'avoir compris. Tu veux empêcher tout le monde de télécharger tes images ? Ou juste empêcher le hotlink ( le fait que quelqu'un utilise l'URL de ton image pour l'afficher sur son site) ? Ou alors autre chose et j'ai vraiment rien compris ^^
Dans le second cas, c'est très simple, dans le premier, tout simplement impossible.
Impossible dans le sens où il y aura toujours un moyen de récupérer l'image "à la main".
Peut être que la solution serait tout simplement de mettre un watermak ( sorte de signature http://fr.wikipedia.org/wiki/Tatouage_num%C3%A9rique) sur tes images, comme ça personne ne pourra usurper ton travail.


EDIT : Après relecture je pense que j'avais mal compris ta question. Tu veux en fait prévenir les attaques d'injection de code php à l'aide d'une fausse image, c'est ça ?
Du coup mes solutions sont inutiles, et le mieux est effectivement ce qui a été dis lors des précédents posts. Bonne chance ;)
Nside
Messages : 82
Inscription : 24 septembre 2011 à 00:05

En effet tu avais très mal compris ;)

Les deux solutions dite précédemment, m'affiche toujours, "Le fichier envoyé n'est pas une image"...
Inconnu
Cet utilisateur a supprimé son compte et n’existe plus.
Messages : 6340
Inscription : 29 décembre 2010 à 18:15

Tu as dis

"Dans le truc 'image/', faut que j'écrive le nom du dossier ? C'est ce que j'ai fait... Sauf qu'il m'indique toujours que le fichier envoyer n'est pas une image. "

Ce à quoi j'avais répondu
"Et pour image/ , il ne faut pas le remplacer, ce n'est pas un répertoire, c'est le début du type MIME image , ex : image/png. "

As-tu bien laissé "image/" ? ça peut venir de là

Bonne chance !
Répondre