Contexto
Despues de escribir sanitize_check.py con 20+ patterns de regex para detectar datos sensibles, lo corri contra el propio repositorio. Resultado: 20+ findings... todos del propio sanitize_check.py.
Lo que aprendi
Un scanner de seguridad que contiene los patterns como strings se auto-detecta como leak. La solucion obvia pero facil de olvidar: excluir los archivos que contienen los patterns por definicion.
EXCLUDED_FILES = {
"sanitize_check.py", # contiene los patterns
"02-security-publication-checklist.md", # documenta que buscar
}
def should_skip_file(filepath):
basename = os.path.basename(filepath)
if basename in EXCLUDED_FILES:
return True
_, ext = os.path.splitext(filepath)
if ext.lower() in BINARY_EXTENSIONS:
return True
return False
El ciclo del problema
- Escribes pattern:
(r"myserver01", "Internal hostname") - Corres el scanner contra el repo
- El scanner encuentra
"myserver01"en...sanitize_check.pylinea 15 - Reporta un falso positivo
- Multiplica por 20+ patterns = reporte inutil lleno de ruido
Por que un set y no una lista
# Set: O(1) lookup
EXCLUDED_FILES = {"sanitize_check.py", "02-security-publication-checklist.md"}
# vs Lista: O(n) lookup
EXCLUDED_FILES = ["sanitize_check.py", "02-security-publication-checklist.md"]
Con pocos elementos la diferencia es irrelevante, pero es un buen habito para cuando el scanner crece.
Alternativa: patterns en archivo externo
Otra solucion es mover los patterns a un .yaml o .json separado y excluir ese archivo. Pero tener todo en un solo .py es mas simple para distribuir y mantener.
Leccion general
Cualquier herramienta que busca patterns en texto se encontrara a si misma si contiene esos patterns. Aplica a:
- Linters con reglas custom
- Validators de formato
- Grep wrappers
- CI/CD checks
Siempre incluir una lista de exclusion para los archivos que definen las reglas.