>  기사  >  웹 프론트엔드  >  파일 경로 보안: 디렉터리 탐색 공격 방지

파일 경로 보안: 디렉터리 탐색 공격 방지

Susan Sarandon
Susan Sarandon원래의
2024-10-21 22:56:30425검색

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으로 문의하세요.