Powrót do strony głównej

Czyszczenie metadanych ze schowka Python

Usługa w tle na Pythonie dla Windows automatycznie czyści metadane z plików w schowku podczas kopiowania. Obsługuje obrazy, DOCX, PDF z ochroną przed atakami i atomowym przepisaniem. Rozbiór architektury, kodu i typowych błędów Win32 API.

Demon Python: czyszczenie metadanych w clipboard
Advertisement 728x90

Automatyczne czyszczenie metadanych plików w schowku za pomocą Pythona

Demon działający w tle dla Windows przechwytuje pliki w schowku zaraz po skopiowaniu i usuwa z nich metadane przed wklejeniem. Pozwala to uniknąć ręcznego przetwarzania obrazów, dokumentów i wideo za pomocą ExifTool lub narzędzi systemowych. Przetwarzanie odbywa się lokalnie bez przesyłania danych na zewnątrz, z ochroną przed uszkodzeniami i atakami przez dowiązania symboliczne.

Praca ze schowkiem przez Win32 API

Monitorowanie schowka realizowane jest przez wątek ClipboardMonitor, który sprawdza clipboard co 500 ms. Kluczowy format to CF_HDROP, zawierający listę ścieżek do plików.

Problemy z pywin32:

Google AdInline article slot
  • W starszych wersjach GetClipboardData(CF_HDROP) zwraca wskaźnik do DROPFILES, wymagający DragQueryFileW z shell32.dll przez ctypes.
  • W nowszych — listę ciągów znaków, ale PyInstaller lub niezgodność DLL psuje zachowanie.

Kod sprawdzający:

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

Walidacja ścieżek dla bezpieczeństwa

Przed przetworzeniem ścieżki przechodzą rygorystyczne kontrole w validate_path:

  • Ścieżka bezwzględna.
  • Porównanie inode oryginału i resolved_path (blokowanie dowiązań symbolicznych).
  • Wykluczenie katalogów w WINDIR.
  • Limit liczby plików (ochrona przed masowym przetwarzaniem).

Zapobiega to atakom przez symlinki i przetwarzaniu katalogów systemowych. Dodatkowo sprawdzane jest resolved_path.is_file() dla wykluczenia folderów.

Google AdInline article slot

Architektura przetwarzania: nadpisywanie w miejscu

Pliki są nadpisywane oryginalną ścieżką bez podmiany w schowku — upraszcza to pracę z blokadami pamięci Windows. Sekwencja:

  • Kopiowanie pliku do schowka.
  • Wykrycie CF_HDROP.
  • Walidacja i przekazanie do MetadataScrubber.
  • Nadpisanie oczyszczoną wersją.

Czyszczenie obrazów: atomowa wymiana

Obsługa JPEG, PNG, TIFF, BMP. Usuwane są EXIF z danymi geolokalizacyjnymi, urządzeniem, oprogramowaniem.

Strategia — plik tymczasowy dla atomowości:

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))

Gwarantuje integralność: wklejenie otrzymuje albo oryginał, albo oczyszczony plik.

DOCX: bezpośrednia edycja XML

python-docx zmienia właściwości, ale nie śledzenie zmian i komentarze. Rozwiązanie — parsowanie części _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')

Hack z replace usuwa tagi rewizji u źródła, czyniąc dokument finalnym dla Worda. Ryzyko — złożone tabele.

PDF i wideo: podstawowa obsługa

PDF przez pypdf:

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

Przebudowa bez metadanych. Wideo (MP4, MKV, MOV) — podstawowe czyszczenie atomów, pełne wymaga ffmpeg.

Problemy z zasobnikiem systemowym

Rezygnacja z powiadomień z powodu błędów Shell_NotifyIcon:

  • Nieprawidłowy lifecycle HWND prowadzi do błędów DestroyWindow.
  • Obiekty COM crashują przy zamykaniu Tkinter.

Rozwiązanie — wycięcie modułu dla stabilności tła. Polling 500 ms daje 0% CPU w bezczynności.

Co jest ważne

  • Automatyczne czyszczenie metadanych (EXIF, śledzenie zmian, dane geolokalizacyjne) przy kopiowaniu do schowka.
  • Ochrona przed atakami przez dowiązania symboliczne i ścieżkami systemowymi przez walidację.
  • Atomowe nadpisywanie plików bez ryzyka uszkodzeń.
  • Lokalne przetwarzanie w Pythonie (PIL, pywin32, pypdf) bez zewnętrznych serwerów.
  • Zoptymalizowane monitorowanie schowka z minimalnym obciążeniem.

— Editorial Team

Advertisement 728x90

Czytaj dalej