ファイル パスを不適切に処理すると、ディレクトリ トラバーサル攻撃として知られるセキュリティ上の脆弱性が発生する可能性があります。これらの脆弱性により、攻撃者はサーバー上の任意のファイルにアクセスできます。
ディレクトリ トラバーサル攻撃は、攻撃者がファイル パスを操作して、意図したディレクトリの外にあるファイルにアクセスするときに発生します。たとえば、アプリケーションがユーザー指定のファイル パスを検証せずに使用すると、攻撃者は ../../etc/passwd のようなパスを使用してサーバー上の機密ファイルにアクセスする可能性があります。
const filePath = `public/uploads/${req.params.fileName}`;
ユーザーが ID を指定してファイルをダウンロードできるファイル ダウンロード機能があると想像してください。アプリケーションはユーザー入力から直接ファイル パスを構築する場合があります。
/public/uploads/../../secret.txt
ここで、攻撃者は ../../secret.txt などの悪意のある入力を提供し、意図しないファイル アクセスにつながる可能性があります。
アプリケーションがこの入力を検証しない場合、構成ファイルやユーザー データなどの機密ファイルが攻撃者に公開される可能性があります。
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" }); } };
ベース ディレクトリ定義: アクセスを制限するために、ファイル アップロード用の固定ディレクトリを確立します。
ファイル名の抽出: URL パラメーターから要求されたファイル名を取得します。
ファイル パスの構築: ベース ディレクトリと要求されたファイル名を組み合わせてフル パスを作成します。
パス検証: 不正なアクセスを防ぐために、解決されたファイル パスが指定されたベース ディレクトリ内にあることを確認します。
ファイル存在チェック: 構築されたパスにファイルが存在するかどうかを非同期的にチェックします。
ファイル ダウンロード処理: ファイルのダウンロードを開始し、プロセス中に発生する可能性のあるエラーを処理します。
見つからないファイルのエラー処理: 要求されたファイルが存在しない場合は 404 応答を送信します。
謝辞: このドキュメントは PortSwigger Web Security および ChatGPT からの情報を参照しています。
以上がファイル パスの保護: ディレクトリ トラバーサル攻撃の防止の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。