Ich habe eine Java-Server-Implementierung (TFTP, wenn es Ihnen wichtig ist) und ich möchte sicherstellen, dass es nicht anfällig für Pfad Traversalen Angriffe den Zugriff auf Dateien und Standorte, die nicht verfügbar sein sollten.Was ist der beste Weg, um gegen einen Traversal-Angriff zu verteidigen?
Mein bester Versuch so weit zu verteidigen ist keine Einträge abzulehnen, die File.isAbsolute()
und dann verlassen sich auf File.getCanonicalPath()
passen aus dem Weg alle ../
und ./
Komponenten zu lösen. Schließlich stelle ich sicher, dass der resultierende Weg noch innerhalb der erforderlichen Stammverzeichnis von meinem Server ist:
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 Sicherheitsprobleme, dass dies verpasst? Ist es besser/schneller, das gleiche Ergebnis zuverlässig zu erreichen?
Der Code muss konsistent über Windows und Linux hinweg funktionieren.
Vergessen Sie nicht, den Zugriff auf die Windows-Spezialgeräte (NUL, COM1, etc.), die in dem Dateisystem vorhanden sind überall zu verbieten. –
Guten Gedanken Heath. Der folgende Link scheint eine definitive Liste der reservierten Windows-Dateinamen zu haben: http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx –
Warum können Sie das nicht auf Ihrem Computer konfigurieren? Apache/IIS Server stattdessen? – kikito