Unsachgemäßer Umgang mit Dateipfaden kann zu Sicherheitslücken führen, die als Directory-Traversal-Angriffe bekannt sind. Diese Schwachstellen ermöglichen es einem Angreifer, auf beliebige Dateien auf dem Server zuzugreifen.
Ein Directory-Traversal-Angriff liegt vor, wenn ein Angreifer Dateipfade manipuliert, um auf Dateien außerhalb des vorgesehenen Verzeichnisses zuzugreifen. Wenn eine Anwendung beispielsweise einen vom Benutzer bereitgestellten Dateipfad ohne Validierung verwendet, könnte ein Angreifer einen Pfad wie ../../etc/passwd verwenden, um auf vertrauliche Dateien auf dem Server zuzugreifen.
const filePath = `public/uploads/${req.params.fileName}`;
Stellen Sie sich vor, Sie verfügen über eine Funktion zum Herunterladen von Dateien, mit der Benutzer Dateien herunterladen können, indem sie eine ID angeben. Die Anwendung erstellt den Dateipfad möglicherweise direkt aus der Benutzereingabe.
/public/uploads/../../secret.txt
Hier könnte ein Angreifer eine bösartige Eingabe wie ../../secret.txt bereitstellen, die zu einem unbeabsichtigten Dateizugriff führt.
Wenn die Anwendung diese Eingabe nicht validiert, könnte sie dem Angreifer sensible Dateien wie Konfigurationsdateien oder Benutzerdaten zugänglich machen.
import path from 'path'; import fs from 'fs/promises'; import { RequestHandler, NextFunction } from 'express'; // Point: 1 const BASE_DIRECTORY = path.resolve(__dirname, 'public/uploads'); export const downloadAttachment: RequestHandler = async (req, res, next: NextFunction) => { // Point: 2 const { fileName } = req.params; // Point: 3 const filePath = path.join(BASE_DIRECTORY, fileName); const resolvedPath = path.resolve(filePath); // Point: 4 if (!resolvedPath.startsWith(BASE_DIRECTORY)) { return res.status(400).json({ message: "Invalid file path" }); } try { // Point: 5 await fs.access(resolvedPath); // Point: 6 res.download(resolvedPath, path.basename(fileName), (err) => { if (err) { return next(err); } }); } catch { // Point: 7 return res.status(404).json({ message: "File not found" }); } };
Basisverzeichnisdefinition: Richtet ein festes Verzeichnis für Datei-Uploads ein, um den Zugriff einzuschränken.
Dateinamen extrahieren: Ruft den angeforderten Dateinamen aus den URL-Parametern ab.
Dateipfadkonstruktion: Kombiniert das Basisverzeichnis mit dem angeforderten Dateinamen, um einen vollständigen Pfad zu erstellen.
Pfadvalidierung: Stellt sicher, dass sich der aufgelöste Dateipfad im angegebenen Basisverzeichnis befindet, um unbefugten Zugriff zu verhindern.
Dateiexistenzprüfung: Prüft asynchron, ob die Datei im erstellten Pfad vorhanden ist.
Handhabung des Dateidownloads: Initiiert den Dateidownload und behandelt alle Fehler, die während des Vorgangs auftreten können.
Fehlerbehandlung für fehlende Dateien: Sendet eine 404-Antwort, wenn die angeforderte Datei nicht vorhanden ist.
Dankstelle: Dieses Dokument verweist auf Informationen von PortSwigger Web Security und ChatGPT.
Das obige ist der detaillierte Inhalt vonDateipfade sichern: Directory-Traversal-Angriffe verhindern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!