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 :
- Dans les anciennes versions,
GetClipboardData(CF_HDROP)renvoie un pointeur versDROPFILES, nécessitantDragQueryFileWdeshell32.dllviactypes. - 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.
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é :
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
Aucun commentaire pour le moment.