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

Dateipfade sichern: Directory-Traversal-Angriffe verhindern

Susan Sarandon
Freigeben: 2024-10-21 22:56:30
Original
433 Leute haben es durchsucht

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}`;
Nach dem Login kopieren

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
Nach dem Login kopieren

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" });
    }
};
Nach dem Login kopieren

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!

Quelle:dev.to
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage