首頁 > web前端 > js教程 > 主體

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

Susan Sarandon
發布: 2024-10-21 22:56:30
原創
346 人瀏覽過

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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!