Ho un'implementazione del server Java (TFTP se è importante per voi) e mi piacerebbe assicurarmi che non sia suscettibile agli attacchi di traversal path che consentono l'accesso a file e posizioni che non dovrebbero essere disponibili.Qual è il modo migliore per difendersi da un attacco di attraversamento del percorso?
Il mio miglior tentativo di difendere finora è quello di respingere tutte le voci che corrispondono File.isAbsolute()
e poi si basano su File.getCanonicalPath()
per risolvere eventuali componenti ../
e ./
fuori del percorso. Infine ho assicurarsi che il percorso risultante è ancora all'interno della directory principale richiesta del mio server:
public String sanitize(final File dir, final String entry) throws IOException {
if (entry.length() == 0) {
throw new PathTraversalException(entry);
}
if (new File(entry).isAbsolute()) {
throw new PathTraversalException(entry);
}
final String canonicalDirPath = dir.getCanonicalPath() + File.separator;
final String canonicalEntryPath = new File(dir, entry).getCanonicalPath();
if (!canonicalEntryPath.startsWith(canonicalDirPath)) {
throw new PathTraversalException(entry);
}
return canonicalEntryPath.substring(canonicalDirPath.length());
}
ci sono problemi di sicurezza che questo manca? È meglio/più veloce ottenere lo stesso risultato in modo affidabile?
Il codice deve funzionare in modo coerente su Windows e Linux.
Non dimenticare di disabilitare l'accesso ai dispositivi speciali Windows (NUL, COM1, ecc.) Presenti ovunque nel file system. –
Buona idea, Heath. Il seguente collegamento sembra avere un elenco definitivo dei nomi di file riservati di Windows: http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx –
Perché non puoi configurarlo sul tuo Server Apache/IIS invece? – kikito