Files
fn_registry/python/functions/infra/safe_extract_zip.md
T
egutierrez 9fd0ca9cac feat: funciones Python infra y tipos Python (core, datascience, infra)
Infra: cache_to_file, cache_to_sqlite, http_download_file, http_get_json,
http_post_json, read_file_with_encoding, safe_extract_zip, scan_directory,
setup_logger, normalize_zip_filenames.
Tipos: 30+ tipos core (agent_action, context, task, message, parse_result...),
6 tipos datascience (entity_candidate, extraction_result...), 2 tipos infra.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 17:11:43 +02:00

1.6 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports tested tests test_file_path file_path
safe_extract_zip function py infra 1.0.0 impure def safe_extract_zip(zip_path: str, dest_dir: str) -> None 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.
zip
extract
security
zip-slip
path-traversal
infra
io
normalize_zip_filenames_py_infra
false error_go_core
os
zipfile
pathlib
true
ZIP normal extrae correctamente dentro del destino
ZIP con path traversal lanza ValueError
ZIP con paths absolutos lanza ValueError
python/functions/infra/safe_extract_zip_test.py python/functions/infra/safe_extract_zip.py

Ejemplo

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.