파일 경로를 부적절하게 처리하면 디렉터리 탐색 공격이라는 보안 취약점이 발생할 수 있습니다. 이러한 취약점으로 인해 공격자는 서버에 있는 임의의 파일에 접근할 수 있습니다.
디렉터리 순회 공격은 공격자가 의도한 디렉터리 외부의 파일에 접근하기 위해 파일 경로를 조작할 때 발생합니다. 예를 들어 애플리케이션이 유효성 검사 없이 사용자가 제공한 파일 경로를 사용하는 경우 공격자는 ../../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 중국어 웹사이트의 기타 관련 기사를 참조하세요!