En photographie numérique, les métadonnées sont stockées à l'intérieur d'un fichier JPG
et permettent de décrire un certain nombre d'informations complémentaires.
Elles sont réparties en 3 catégories (Source imatag.com) :
1 EXIF (Exchangeable image file format)
Le type EXIF contient principalement des informations techniques liées à la prise de vue.
- Marque et Modèle
- Date du cliché
- Vitesse d'obturation
- Exposition
- Ouverture du diaphragme
- Sensibilité (ISO)
- Distance focale
- Objectif
- Flash activé ou désactivé
- Source lumineuse
- Coordonnées GPS
- Copyright
2 IPTC (International Press Telecommunications Council)
Le type IPTC contient des informations enrichies manuellement par le photographe ou par des agences.
- Nom de l'auteur
- Adresse
- Numéro de téléphone
- Adresse email
- Site web
- Licence
- Pays où a été prise la photo
- Mots-clés
3 XMP (Extensible Metadata Platform)
Ce nouveau type permet de définir l'ensemble des informations précédentes et de les enrichir. Le format étant en XML, celui-ci peut être étendu simplement.
Les risques
Ces informations sont très utiles pour les photographes. Elles permettent d'enrichir les photos, améliore la traçabilité et la recherche par mots clés. Mais il est possible d'insérer dans ces données, grâce à des logiciels comme Exiftool, du code PHP qui pourra ensuite être exécuté une fois envoyé sur votre serveur.
exiftool -documentname='<?php echo "test"; ?>'
Si votre site contient le code suivant, alors le code PHP contenu dans le fichier exemple.jpg
va s'exécuter :
include("exemple.jpg");
Solutions
Il est donc fortement déconseillé d'utiliser les fonctions include
, require
ou include_once
pour intégrer une image depuis le PHP.
Il est également possible de supprimer toutes métadonnées d'une photo avec la librairie Gmagick :
$imageFilePath = 'exemple.jpg';
$i = new Gmagick();
$i->readImage($imageFilePath);
$i->setImageFormat('JPG');
$i->stripImage();
$i->profileImage('*', null);
$i->writeImage($imageFilePath);
$i->destroy();
La librairie Imagick permet également de faire la même chose :
$imageFilePath = 'exemple.jpg';
$img = new Imagick(realpath($imageFilePath));
$profiles = $img->getImageProfiles("icc", true);
$img->stripImage();
if(!empty($profiles)) {
$img->profileImage("icc", $profiles['icc']);
}
Lors de l'envoi de fichiers depuis un formulaire (photos ou tout type de fichiers), il est obligatoire de vérifier sa validité. Ne jamais faire confiance à l'utilisateur ni à son navigateur. Côté serveur, on met en place plusieurs niveaux de vérification :
- On vérifie l'extension du fichier pour qu'elle soit celle attendue. *.jpg ou *.png pour une photo, *.pdf pour un document...
- On vérifie son type mime, si le fichier est réellement au format souhaité
- On vérifie la taille du fichier
- On supprime les métadonnées dans le cas d'envoi de photos
- On envoie le fichier dans un répertoire non accessible, en dehors de la racine du site web, ou dans un répertoire ou il est interdit de lancer du php
- On renomme le fichier pour éviter de garder le nom initial
- Si possible, on lance une analyse anti-malware
Par Thibaut Pietri
Derniers articles
Comment vérifier si votre site internet a été piraté ou infecté ?
9 août 2019 Le piratage d'un site web peut parfois ne pas être visible directement avec un navigateur web. En effet le piratage peut avoir des objectifs variés. Certains ont tout intérêt à rester invisible.
L'authentification à facteurs multiples pour protéger votre site web
7 août 2019 L'authentification à facteurs multiples est un système de sécurité combinant au moins deux modes d'identification différents. Explications.
Comprendre le sens des mots chiffrement, hachage et cryptage
5 août 2019 Dans le domaine de la sécurité informatique beaucoup de termes techniques sont souvent mal employés. Explications.