ファイル パスの保護: ディレクトリ トラバーサル攻撃の防止

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!