Retour à l'accueil

Nettoyage des Métadonnées du Presse-Papiers Python

Service Python en arrière-plan pour Windows nettoie automatiquement les métadonnées des fichiers dans le presse-papiers lors de la copie. Prend en charge les images, DOCX, PDF avec protection contre les attaques et écrasement atomique. Analyse de l'architecture, du code et des erreurs typiques de l'API Win32.

Démon Python : nettoyage des métadonnées dans le presse-papiers
Advertisement 728x90

Nettoyage automatique des métadonnées des fichiers du presse-papiers en Python

Un démon d'arrière-plan pour Windows intercepte les fichiers dans le presse-papiers immédiatement après la copie et supprime leurs métadonnées avant le collage. Cela élimine le besoin de traitement manuel des images, documents et vidéos avec ExifTool ou des utilitaires système. Le traitement s'effectue localement sans transfert de données externe, avec une protection contre la corruption et les attaques par liens symboliques.

Travailler avec le presse-papiers via l'API Win32

La surveillance du presse-papiers est implémentée par un thread ClipboardMonitor qui interroge le presse-papiers toutes les 500 ms. Le format clé est CF_HDROP, qui contient une liste de chemins de fichiers.

Problèmes avec pywin32 :

Google AdInline article slot
  • Dans les anciennes versions, GetClipboardData(CF_HDROP) renvoie un pointeur vers DROPFILES, nécessitant DragQueryFileW de shell32.dll via ctypes.
  • Dans les versions plus récentes, il renvoie une liste de chaînes, mais PyInstaller ou des incompatibilités de DLL peuvent casser ce comportement.

Vérifiez le code :

if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_HDROP):
    file_list = win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)

Validation des chemins pour la sécurité

Avant le traitement, les chemins subissent des vérifications strictes dans validate_path :

  • Chemin absolu.
  • Comparaison de l'inode original et du resolved_path (pour bloquer les liens symboliques).
  • Exclusion des répertoires dans WINDIR.
  • Limite sur le nombre de fichiers (protection contre le traitement de masse).

Cela empêche les attaques par liens symboliques et le traitement des répertoires système. De plus, resolved_path.is_file() est vérifié pour exclure les dossiers.

Google AdInline article slot

Architecture de traitement : Écrasement sur place

Les fichiers sont écrasés à leur chemin d'origine sans substitution dans le presse-papiers—cela simplifie la gestion des verrous mémoire Windows. Séquence :

  • Copie d'un fichier dans le presse-papiers.
  • Détection de CF_HDROP.
  • Validation et passage à MetadataScrubber.
  • Écrasement avec la version nettoyée.

Nettoyage des images : Remplacement atomique

Prise en charge de JPEG, PNG, TIFF, BMP. Supprime les données EXIF, y compris la géolocalisation, l'appareil et les informations logicielles.

Stratégie—fichier temporaire pour l'atomicité :

Google AdInline article slot
with Image.open(file_path) as img:
    data = list(img.getdata())
    image_without_exif = Image.new(img.mode, img.size)
    image_without_exif.putdata(data)
    
    temp_path = file_path.with_suffix(file_path.suffix + '.temp')
    image_without_exif.save(temp_path, format=format_name)
    
    shutil.move(str(temp_path), str(file_path))

Garantit l'intégrité : le collage reçoit soit le fichier original, soit le fichier nettoyé.

DOCX : Édition XML directe

python-docx change les propriétés mais pas les modifications suivies et les commentaires. Solution—analyse des parties _blob :

xml = part._blob.decode('utf-8')
if 'w:revision' in xml or 'w:ins' in xml or 'w:del' in xml:
    xml = xml.replace('w:revision', 'w:revision_removed')\
             .replace('w:ins ', 'w:p ')\
             .replace('w:del ', 'w:p ')
    part._blob = xml.encode('utf-8')

Un hack avec replace supprime les balises de révision à la racine, rendant le document final pour Word. Risque—tableaux complexes.

PDF et vidéo : Support basique

PDF via pypdf :

writer = PdfWriter()
for page in reader.pages:
    writer.add_page(page)
writer.add_metadata({})

Reconstruction sans métadonnées. Vidéo (MP4, MKV, MOV)—nettoyage basique des atomes ; un nettoyage complet nécessite ffmpeg.

Problèmes avec la barre d'état système

Éviter les notifications en raison d'erreurs Shell_NotifyIcon :

  • Cycle de vie incorrect de HWND entraîne des échecs de DestroyWindow.
  • Les objets COM plantent lors de la fermeture de Tkinter.

Solution—suppression du module pour la stabilité en arrière-plan. L'interrogation à 500 ms entraîne 0 % d'utilisation du CPU au repos.

Points clés

  • Nettoyage automatique des métadonnées (EXIF, modifications suivies, géolocalisation) lors de la copie dans le presse-papiers.
  • Protection contre les attaques par liens symboliques et les chemins système via la validation.
  • Écrasement atomique des fichiers sans risque de corruption.
  • Traitement local en Python (PIL, pywin32, pypdf) sans serveurs externes.
  • Surveillance optimisée du presse-papiers avec une surcharge minimale.

— Editorial Team

Advertisement 728x90

Lire ensuite