Was ist der beste Weg, um sich gegen einen Pfadüberquerungsangriff zu verteidigen?

Ich habe eine Java-Server-Implementierung (TFTP, falls es für Sie von Bedeutung ist) und möchte sicherstellen, dass sie nicht für Pfadüberquerungsangriffe anfällig ist, die den Zugriff auf Dateien und Speicherorte ermöglichen, die nicht verfügbar sein sollten.

Mein bisher bester Versuch zu verteidigen ist es, alle übereinstimmenden Einträge abzulehnenFile.isAbsolute() und dann verlassen sich aufFile.getCanonicalPath() zu lösen../ und./ Komponenten aus dem Weg. Abschließend stelle ich sicher, dass sich der resultierende Pfad noch im erforderlichen Stammverzeichnis meines Servers befindet:

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());
}

Gibt es Sicherheitslücken? Gibt es bessere / schnellere, um zuverlässig das gleiche Ergebnis zu erzielen?

Der Code muss unter Windows und Linux konsistent funktionieren.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage