--- name: safe_extract_zip kind: function lang: py domain: infra version: "1.0.0" purity: impure signature: "def safe_extract_zip(zip_path: str, dest_dir: str) -> None" description: "Extrae un archivo ZIP con proteccion contra Zip Slip (path traversal attack). Valida que cada archivo extraido quede dentro del directorio destino antes de extraerlo. Normaliza nombres de archivo UTF-8 antes de extraer." tags: [zip, extract, security, zip-slip, path-traversal, infra, io, pendiente-usar] uses_functions: [normalize_zip_filenames_py_infra] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [os, zipfile, pathlib] params: - name: zip_path desc: "ruta del archivo ZIP a extraer" - name: dest_dir desc: "directorio destino para la extraccion" output: "None (extrae archivos al disco en dest_dir)" tested: true tests: - "ZIP normal extrae correctamente dentro del destino" - "ZIP con path traversal lanza ValueError" - "ZIP con paths absolutos lanza ValueError" test_file_path: "python/functions/infra/safe_extract_zip_test.py" file_path: "python/functions/infra/safe_extract_zip.py" --- ## Ejemplo ```python from safe_extract_zip import safe_extract_zip # Extraccion segura try: safe_extract_zip("archive.zip", "/tmp/output") except ValueError as e: print(f"Zip Slip bloqueado: {e}") except zipfile.BadZipFile: print("Archivo ZIP invalido") ``` ## Notas Funcion impura: escribe archivos en disco. La proteccion contra Zip Slip consiste en resolver el path absoluto de cada miembro antes de extraerlo y verificar que empiece con `str(dest_dir) + os.sep`. Esto bloquea tanto `../../etc/passwd` como `/etc/passwd`. La normalizacion de nombres UTF-8 se delega a `normalize_zip_filenames` y se ejecuta antes de la validacion de paths.