파이썬 클립보드 파일 메타데이터 자동 제거 가이드
Windows 백그라운드 데몬이 파일을 클립보드에 복사한 직후 이를 가로채어 붙여넣기 전에 메타데이터를 제거합니다. 이를 통해 ExifTool이나 시스템 유틸리티를 사용한 이미지, 문서, 비디오의 수동 처리가 필요 없어집니다. 처리 과정은 외부 데이터 전송 없이 로컬에서 이루어지며, 손상 및 심볼릭 링크 공격에 대한 보호 기능을 포함합니다.
Win32 API를 통한 클립보드 작업
클립보드 모니터링은 500ms마다 클립보드를 확인하는 ClipboardMonitor 스레드로 구현됩니다. 핵심 포맷은 파일 경로 목록을 포함하는 CF_HDROP입니다.
pywin32 관련 문제:
- 구버전에서는
GetClipboardData(CF_HDROP)가DROPFILES에 대한 포인터를 반환하여ctypes를 통해shell32.dll의DragQueryFileW가 필요합니다. - 신버전에서는 문자열 목록을 반환하지만, PyInstaller나 DLL 불일치로 이 동작이 깨질 수 있습니다.
코드 확인:
if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_HDROP):
file_list = win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)
보안을 위한 경로 검증
처리 전, 경로는 validate_path에서 엄격한 검사를 거칩니다:
- 절대 경로.
- 원본 inode와 resolved_path 비교(심볼릭 링크 차단용).
WINDIR내 디렉터리 제외.- 파일 수 제한(대량 처리 방지).
이를 통해 심볼릭 링크 공격과 시스템 디렉터리 처리를 방지합니다. 추가로 resolved_path.is_file()을 확인하여 폴더를 제외합니다.
처리 아키텍처: 제자리 덮어쓰기
파일은 클립보드에서 대체하지 않고 원본 경로에서 덮어쓰기됩니다—이렇게 하면 Windows 메모리 잠금 처리가 단순해집니다. 순서:
- 파일을 클립보드에 복사.
CF_HDROP감지.- 검증 후
MetadataScrubber로 전달. - 깨끗한 버전으로 덮어쓰기.
이미지 메타데이터 제거: 원자적 교체
JPEG, PNG, TIFF, BMP 지원. 위치 정보, 장치, 소프트웨어 정보를 포함한 EXIF 데이터를 제거합니다.
전략—원자성을 위한 임시 파일:
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))
무결성 보장: 붙여넣기 시 원본 또는 제거된 파일을 받습니다.
DOCX: 직접 XML 편집
python-docx는 속성을 변경하지만 변경 내용 추적과 주석은 변경하지 않습니다. 해결책—_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')
replace를 사용한 해킹으로 루트 수준의 수정 태그를 제거하여 Word에서 최종 문서로 만듭니다. 위험—복잡한 표.
PDF 및 비디오: 기본 지원
pypdf를 통한 PDF:
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.add_metadata({})
메타데이터 없이 재구성. 비디오(MP4, MKV, MOV)—기본적인 atom 제거; 완전한 제거에는 ffmpeg가 필요합니다.
시스템 트레이 문제
Shell_NotifyIcon 오류로 인한 알림 방지:
- 잘못된 HWND 수명 주기로
DestroyWindow실패 발생. - Tkinter 종료 시 COM 객체 충돌.
해결책—백그라운드 안정성을 위해 모듈 제거. 500ms 폴링으로 유휴 상태 시 CPU 사용률 0%.
핵심 포인트
- 클립보드에 복사 시 메타데이터 자동 제거(EXIF, 변경 내용 추적, 위치 정보).
- 검증을 통한 심볼릭 링크 공격 및 시스템 경로 보호.
— Editorial Team
아직 댓글이 없습니다.