I percorsi in Windows sono relativamente complessi . In particolare, Microsoft ha l'abitudine di inventare nuove funzionalità, quindi anche se il tuo server HTTP è veramente protetto dal path traversal oggi , potrebbe diventare vulnerabile alla prossima versione di Windows, possibilmente anche un piccolo aggiornamento.
In questo momento stai usando il "pensiero della lista nera": stai tentando di enumerare tutte le costruzioni "cattive" e in particolare di rilevarle. Le liste nere sono note per essere fragili perché è molto difficile essere esaurienti e quindi rimanere esaurienti. Dovresti usare la whitelist-thinking , cioè definire una sintassi per percorsi consentiti ed escludere tutto il resto.
Ad esempio, definisci che un percorso consentito consiste in una sequenza di componenti separati da caratteri della barra ("/", non "\"), con le seguenti regole:
- Un componente contiene solo lettere, cifre, trattini ("-"), caratteri di sottolineatura ("_") o punti (".").
- Un punto potrebbe non apparire come primo o ultimo carattere in un componente.
- Non ci devono essere due punti consecutivi in un componente.
- Un componente contiene almeno un carattere e al massimo 64 caratteri (limite arbitrario).
- Non possono essere visualizzate due barre consecutive in un percorso.
- Un percorso non inizia con una barra.
- Un percorso non è vuoto.
- La lunghezza totale di un percorso non deve superare i 250 caratteri.
Tutte queste regole sono facili da applicare a livello di codice. E garantiscono un "percorso locale pulito" che puoi inviare a fopen()
. Nota che la maggior parte delle funzioni di Windows sono perfettamente soddisfatte del "/" come separatore, ma potresti comunque voler sostituire tutte le barre con barre retroverse ( dopo controllando tutte le regole sopra, ovviamente).