首頁  >  文章  >  web前端  >  保護檔案路徑:防止目錄遍歷攻擊

保護檔案路徑:防止目錄遍歷攻擊

Susan Sarandon
Susan Sarandon原創
2024-10-21 22:56:30346瀏覽

Securing File Paths: Preventing Directory Traversal Attacks

檔案路徑處理不當可能會導致安全漏洞,稱為目錄遍歷攻擊。這些漏洞允許攻擊者存取伺服器上的任意檔案。

什麼是目錄遍歷攻擊?

當攻擊者操縱檔案路徑來存取目標目錄以外的檔案時,就會發生目錄遍歷攻擊。例如,如果應用程式在未經驗證的情況下使用使用者提供的檔案路徑,則攻擊者可以使用 ../../etc/passwd 等路徑來存取伺服器上的敏感檔案。

目錄遍歷攻擊的範例:

  1. 易受攻擊的程式碼:
const filePath = `public/uploads/${req.params.fileName}`;

假設您有一個檔案下載功能,允許使用者透過提供 id 來下載檔案。應用程式可能會直接根據使用者輸入建立檔案路徑。

  1. 惡意輸入:
/public/uploads/../../secret.txt

攻擊者可以在此提供 ../../secret.txt 等惡意輸入,從而導致意外的檔案存取。

  1. 後果:

如果應用程式不驗證此輸入,它可能會將敏感檔案(例如設定檔或使用者資料)暴露給攻擊者。

防止此類攻擊的範例

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

要點解釋:

  1. 基本目錄定義:為檔案上傳建立固定目錄,以限制存取。

  2. 擷取檔案名稱:從 URL 參數擷取要求的檔案名稱。

  3. 檔案路徑建置:將基底目錄與要求的檔案名稱組合起來建立完整路徑。

  4. 路徑驗證:確保解析的檔案路徑位於指定的基底目錄內,以防止未經授權的存取。

  5. 檔案存在檢查:非同步檢查構造路徑中檔案是否存在。

  6. 檔案下載處理:啟動檔案下載並處理過程中可能發生的任何錯誤。

  7. 遺失檔案的錯誤處理:如果要求的檔案不存在,則發送 404 回應。


致謝:本文檔參考了 PortSwigger Web Security 和 ChatGPT 的資訊。


以上是保護檔案路徑:防止目錄遍歷攻擊的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn