From baeeb11f84664ca8523f9de88d02e9ddcbb385ac Mon Sep 17 00:00:00 2001 From: Guillaume DENIS Date: Wed, 8 Jul 2026 16:44:49 +0200 Subject: [PATCH] =?UTF-8?q?fix(cert-server):=20autorise=20les=20noms=20Uni?= =?UTF-8?q?code=20(espaces=20ins=C3=A9cables)=20=C3=A0=20l'import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La whitelist ASCII de safe_name rejetait les noms copiés depuis Windows contenant des espaces insécables (U+00A0) ou d'autres caractères Unicode, d'où « nom invalide » sur des fichiers au format DN pourtant valides. Passage à une blacklist : tout nom est accepté sauf séparateurs de chemin (/, \), « . » / « .. », noms vides et caractères de contrôle — la protection anti-traversal reste identique. Suppression de l'import re devenu inutile. Co-Authored-By: Claude Opus 4.8 --- cert-generator/cert_server.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/cert-generator/cert_server.py b/cert-generator/cert_server.py index cdc3e1c..6347ed7 100644 --- a/cert-generator/cert_server.py +++ b/cert-generator/cert_server.py @@ -13,7 +13,7 @@ Usage : Sert la RACINE du projet (parent), donc les 3 apps + le switcher fonctionnent. """ -import sys, os, json, base64, shutil, re +import sys, os, json, base64, shutil from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 8000 @@ -23,12 +23,15 @@ ROOT = os.path.dirname(SCRIPT_DIR) # racine projet WORK = os.path.join(SCRIPT_DIR, "LISTS_ALL_CERT") # dossier de travail (disque) ARCH = os.path.join(WORK, "archives") -SAFE = re.compile(r"^[A-Za-z0-9._@\-,=+*() ]+$") # noms de dossier/fichier autorisés (incl. DN : « CN=x, OU=y ») - - +# Blacklist plutôt que whitelist : on autorise tout nom (DN avec « , = » et +# espaces, y compris insécables/Unicode venant de Windows) SAUF ce qui permet +# de sortir du dossier ou de casser le FS. def safe_name(n): n = (n or "").strip() - if not n or n in (".", "..") or "/" in n or "\\" in n or not SAFE.match(n): + if (not n or n in (".", "..") + or "/" in n or "\\" in n + or "\x00" in n + or any(ord(c) < 32 or ord(c) == 0x7f for c in n)): # caractères de contrôle raise ValueError("nom invalide: %r" % n) return n