Vérifier la suppression du GPS dans les photos exportées sur iOS

Security ·~6 min de lecture

Vérifier la suppression du GPS dans les photos exportées sur iOS

L’interface de partage peut masquer le lieu de prise de vue alors que le fichier exporté contient encore des coordonnées. Lors du développement d’un export de photos sur iOS, le fichier à contrôler est celui que reçoit réellement le destinataire, et non l’aperçu affiché dans l’application. Une photo de test contenant des données GPS, préparée sur un Mac dans le cloud, permet de transformer cette exigence de confidentialité en contrôle de fichier reproductible.

Définir d’abord le périmètre de l’export

Un parcours courant consiste à sélectionner une photo, la retoucher ou la redimensionner, créer un fichier temporaire, puis transmettre celui-ci au mécanisme de partage. Chaque étape peut traiter les métadonnées différemment. Contrôler uniquement l’image renvoyée par le sélecteur ne prouve pas que le fichier final a été nettoyé ; vérifier la vignette avant le partage ne suffit pas non plus.

Créez vous-même le fichier de test et confirmez que l’original contient bien un dictionnaire GPS. N’utilisez pas de photos de vrais utilisateurs comme échantillons d’intégration continue et ne placez pas de fichier contenant des coordonnées dans un dépôt public. Conservez-le dans un répertoire de ressources de test à accès contrôlé, notez le format et les dimensions en pixels attendus, puis supprimez les fichiers générés après le test.

Le critère de réussite est « le fichier final ne contient pas de dictionnaire GPS », et non « le fichier exporté est identique octet par octet à l’original ». Le réencodage modifie généralement l’empreinte du fichier.

Générer et vérifier le fichier avec ImageIO

Le script Swift ci-dessous lit une image, la décode, puis la réencode dans le type de fichier d’origine. Il ne transmet explicitement que l’orientation, sans recopier l’ensemble du dictionnaire de métadonnées de l’entrée vers la sortie. Il rouvre ensuite le fichier produit pour contrôler le dictionnaire GPS, les dimensions, l’orientation et le format. Enregistrez-le sous redact.swift dans un répertoire isolé :

import Foundation
import ImageIO
import CoreGraphics

guard CommandLine.arguments.count == 3 else {
    fatalError("Usage: redact input output")
}

let input = URL(fileURLWithPath: CommandLine.arguments[1])
let output = URL(fileURLWithPath: CommandLine.arguments[2])
guard input.standardizedFileURL != output.standardizedFileURL else {
    fatalError("Input and output must differ")
}
guard let source = CGImageSourceCreateWithURL(input as CFURL, nil),
      let type = CGImageSourceGetType(source),
      let image = CGImageSourceCreateImageAtIndex(source, 0, nil),
      let original = CGImageSourceCopyPropertiesAtIndex(source, 0, nil)
        as? [CFString: Any],
      let destination = CGImageDestinationCreateWithURL(
        output as CFURL, type, 1, nil
      ) else {
    fatalError("Cannot read input or create output")
}

let orientation = original[kCGImagePropertyOrientation] ?? 1
let options: [CFString: Any] = [
    kCGImagePropertyOrientation: orientation
]
CGImageDestinationAddImage(destination, image, options as CFDictionary)
guard CGImageDestinationFinalize(destination),
      let result = CGImageSourceCreateWithURL(output as CFURL, nil),
      let finalImage = CGImageSourceCreateImageAtIndex(result, 0, nil),
      let metadata = CGImageSourceCopyPropertiesAtIndex(result, 0, nil)
        as? [CFString: Any] else {
    fatalError("Cannot verify output")
}

guard metadata[kCGImagePropertyGPSDictionary] == nil,
      CGImageSourceGetType(result) == type,
      finalImage.width == image.width,
      finalImage.height == image.height,
      String(describing: metadata[kCGImagePropertyOrientation] ?? 1)
        == String(describing: orientation) else {
    fatalError("Export verification failed")
}
print("GPS removed; format, dimensions and orientation checked")

Exécutez-le dans le terminal du Mac dans le cloud :

swiftc -framework Foundation -framework ImageIO \
  -framework CoreGraphics redact.swift -o redact
./redact fixtures/with-gps.jpg output/without-gps.jpg

Créez d’abord le répertoire output et remplacez l’exemple d’entrée par un JPEG dont la présence d’un dictionnaire GPS a été vérifiée. Une exécution réussie indique seulement que ce fichier de sortie a passé le contrôle. Si l’application comporte des parcours de recadrage, de compression ou d’extension de partage, contrôlez le fichier final produit par chacun d’eux. Le script ne remplace pas le test de l’export réellement effectué par l’application.

Ajouter un cas de test négatif

La réussite du seul test « après nettoyage » ne prouve pas que la vérification est efficace. Appliquez la même logique de lecture au fichier de test d’entrée : elle doit y détecter un dictionnaire GPS. Contrôlez ensuite la sortie : ce dictionnaire doit être absent. Si l’entrée ne contenait aucune coordonnée, un test réussi pour les deux fichiers n’a aucune valeur discriminante. Pour éviter les fuites dans les journaux, n’affichez ni les coordonnées ni l’intégralité des métadonnées.

Conservez également une copie non nettoyée comme cas de test négatif et vérifiez que le contrôle la rejette. Copiez directement les octets du fichier, sans passer par un outil d’image susceptible de réécrire les métadonnées. Vous vérifiez ainsi à la fois le nettoyage et le fait que le contrôle ne confond pas « échec de lecture » et « absence de GPS ».

Que vérifier d’autre après le réencodage

Supprimer les données de localisation ne garantit pas que tous les aspects de l’image restent corrects. Le décodage suivi d’un réencodage peut modifier la qualité d’une compression avec perte, le rendu des couleurs ou d’autres métadonnées sans rapport avec la localisation. Des dimensions identiques ne garantissent pas non plus des pixels identiques. Constituez un jeu de régression avec des photos de différentes provenances, couvrant au minimum les prises de vue en portrait et en paysage ainsi que différents marqueurs d’orientation. Examinez les fichiers finaux pour repérer une rotation, une dérive des couleurs ou une dégradation visible.

Contrôle Critère de réussite
Données de localisation Aucun dictionnaire GPS dans le fichier final
Dimensions de l’image Largeur et hauteur conformes aux valeurs attendues pour ce parcours d’export
Orientation à l’affichage Affichage correct selon le marqueur d’orientation de sortie
Format du fichier Le destinataire reçoit le format attendu
Échec de lecture Le test échoue ; le résultat n’est pas interprété comme une « absence de GPS »

Le script d’exemple exige les mêmes dimensions en entrée et en sortie : il convient donc à un export sans redimensionnement. Si le produit recadre ou compresse les images, remplacez cette assertion par les dimensions explicitement attendues pour le parcours concerné. Si un profil colorimétrique ou certains champs de droits d’auteur doivent être conservés, testez-les séparément ; ne recopiez pas tout le dictionnaire de métadonnées d’origine pour les préserver.

Intégrer le contrôle aux tests de validation sur Mac dans le cloud

Placez séparément le fichier de test, les fichiers réellement générés par l’application et le script de contrôle. Le pipeline doit d’abord exécuter l’export, puis lire le fichier situé à l’emplacement de livraison final. Si le fichier est absent, ne peut pas être décodé ou si la lecture des métadonnées échoue, le test doit échouer immédiatement. Attribuez un répertoire de sortie distinct à chaque tâche parallèle pour éviter qu’un fichier laissé par une exécution précédente ne produise un faux succès.

Terminez par une vérification manuelle : effectuez réellement un partage ou un enregistrement depuis l’application, puis contrôlez le fichier reçu par le destinataire, et pas seulement un fichier intermédiaire en cache. Cela permet de détecter, par exemple, un parcours où l’aperçu de retouche a été nettoyé, mais où le partage reprend le fichier d’origine. Supprimez ensuite les exports temporaires. Les rapports de test ne doivent consigner que la présence ou l’absence d’un dictionnaire GPS, les dimensions, l’orientation et l’étape ayant échoué, jamais les coordonnées. Le résultat reste ainsi reproductible sans réexposer dans les journaux de diagnostic les informations que l’export devait supprimer.

Questions fréquentes

Si le lieu n’apparaît pas dans l’application, les données GPS ont-elles disparu ?

Non. Il faut relire les métadonnées du fichier exporté et confirmer l’absence du dictionnaire GPS.

Les deux fichiers doivent-ils avoir la même empreinte après réencodage ?

Non. Le réencodage peut modifier les octets. Vérifiez séparément les données GPS, les dimensions, l’orientation et le rendu.

Louez selon vos besoins

Validez votre prochaine étape sur un Mac mini physique dédié

VMCommit propose des Mac mini M4 physiques dédiés, disponibles à la journée, à la semaine, au mois ou au trimestre. Choisissez un modèle et un emplacement, puis consultez les disponibilités en temps réel dans la console.

Louer un Mac mini