Heim  >  Artikel  >  Web-Frontend  >  Dateipfade sichern: Directory-Traversal-Angriffe verhindern

Dateipfade sichern: Directory-Traversal-Angriffe verhindern

Susan Sarandon
Susan SarandonOriginal
2024-10-21 22:56:30424Durchsuche

Securing File Paths: Preventing Directory Traversal Attacks

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.

Was ist ein Directory-Traversal-Angriff?

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.

Beispiel für einen Directory-Traversal-Angriff:

  1. Anfälliger Code:
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.

  1. Böswillige Eingabe:
/public/uploads/../../secret.txt

Hier könnte ein Angreifer eine bösartige Eingabe wie ../../secret.txt bereitstellen, die zu einem unbeabsichtigten Dateizugriff führt.

  1. Folgen:

Wenn die Anwendung diese Eingabe nicht validiert, könnte sie dem Angreifer sensible Dateien wie Konfigurationsdateien oder Benutzerdaten zugänglich machen.

Beispiel für die Verhinderung solcher Angriffe

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

Wichtige Punkte erklärt:

  1. Basisverzeichnisdefinition: Richtet ein festes Verzeichnis für Datei-Uploads ein, um den Zugriff einzuschränken.

  2. Dateinamen extrahieren: Ruft den angeforderten Dateinamen aus den URL-Parametern ab.

  3. Dateipfadkonstruktion: Kombiniert das Basisverzeichnis mit dem angeforderten Dateinamen, um einen vollständigen Pfad zu erstellen.

  4. Pfadvalidierung: Stellt sicher, dass sich der aufgelöste Dateipfad im angegebenen Basisverzeichnis befindet, um unbefugten Zugriff zu verhindern.

  5. Dateiexistenzprüfung: Prüft asynchron, ob die Datei im erstellten Pfad vorhanden ist.

  6. Handhabung des Dateidownloads: Initiiert den Dateidownload und behandelt alle Fehler, die während des Vorgangs auftreten können.

  7. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn