fix(cert-server): autorise le backslash dans les noms de fichiers (DN échappés)
Les fichiers nommés d'après un DN contenant une virgule échappée (ex: « O=Thales\, DIS ») incluent un backslash, que le filtre bloquait. Sous Linux « \ » est un caractère de nom valide (pas un séparateur), donc le garde est réduit au strict minimum anti-traversal : on rejette seulement « / », « . », « .. », les noms vides et l'octet nul. Tout le reste passe (backslash, virgule, espaces insécables, Unicode). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
baeeb11f84
commit
804b04816f
1 changed files with 5 additions and 7 deletions
|
|
@ -23,15 +23,13 @@ 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")
|
||||
|
||||
# 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.
|
||||
# Filtre minimal : on accepte n'importe quel nom (DN complet avec « , = \ »,
|
||||
# espaces, Unicode…). On NE bloque QUE ce qui permet de sortir du dossier de
|
||||
# travail : « / » (séparateur, déjà découpé en amont), « . »/« .. » et l'octet
|
||||
# nul. « \ » n'est pas un séparateur sous Linux → autorisé (DN à virgule échappée).
|
||||
def safe_name(n):
|
||||
n = (n or "").strip()
|
||||
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
|
||||
if not n or n in (".", "..") or "/" in n or "\x00" in n:
|
||||
raise ValueError("nom invalide: %r" % n)
|
||||
return n
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue