현재 위치: > 최신 기사 목록> md5_file () 함수를 사용할 때 파일 권한 문제로 인해 실패하는 이유는 무엇입니까? 일반적인 상황 및 솔루션 분석

md5_file () 함수를 사용할 때 파일 권한 문제로 인해 실패하는 이유는 무엇입니까? 일반적인 상황 및 솔루션 분석

M66 2025-06-23

PHP에서 MD5_FILE ()은 지정된 파일 컨텐츠의 MD5 해시 값을 계산하는 매우 실용적인 기능입니다. 기본 구문은 다음과 같습니다.

 md5_file(string $filename, bool $binary = false): string|false

이 기능은 파일 확인, 캐싱 메커니즘, 파일 무결성 확인 및 기타 시나리오를 처리하는 데 매우 일반적입니다. 그러나 실제로 사용하는 동안 개발자는 혼란스러운 문제를 겪을 수 있습니다. 파일이 존재하고 경로가 정확하지만 md5_file ()는 false를 반환합니다. 일반적으로 파일 권한 문제 로 인해 발생합니다. 이 기사는 원인, 일반적인 시나리오 및 솔루션을 자세히 분석합니다.


1. 권한 문제로 인해 왜 md5_file ()가 실패합니까?

MD5_FILE ()는 내부적으로 MD5 작업을 수행하기 위해 전체 파일 내용을 읽으려고합니다. 따라서 PHP 스크립트의 권한이 대상 파일을 읽기에 충분하지 않은 경우 함수는 False를 반환합니다.

핵심 요점은 "읽기 가능한 권한"입니다.

md5_file () 의 경우 파일에는 "읽기 가능한 권한"이 있어야합니다. 여기에는 다음 차원이 포함됩니다.

  • 파일 자체는 현재 실행 사용자 (예 : www-data )에게 읽을 수 있어야합니다.

  • 모든 상위 수준 디렉토리에는 PHP가 경로에 액세스 할 수 있도록 "실행 권한"(즉, 입력 할 수 있음)이 있어야합니다.

  • Selinux, Apparmor와 같은 시스템 보안 모듈도 액세스 권한에 영향을 줄 수 있습니다.


2. 일반적인 오류 시나리오 분석

1. 부적절한 파일 권한 설정

파일 권한이 600 (소유자 읽기 가능하고 쓸 수 있음) 인 경우 PHP 실행 사용자가 파일의 소유자가 아닌 경우 파일을 읽지 않습니다.

 -rw-------  1 root root  1024 May 28 10:00 secret.txt

PHP가 www-data 사용자로 실행되면 위 파일을 읽을 수 없으며 md5_file ()이 실패합니다.

2. 디렉토리의 권한이 속한 디렉토리의 권한은 불충분합니다.

파일 자체에 읽기 권한이 있더라도 디렉토리 권한으로 PHP가 입력 할 수없는 경우 파일에 액세스 할 수 없습니다.

 drwx------  2 user user 4096 May 28 10:00 /var/private/

이 경우 파일이 644 로 설정 되더라도 PHP는 /var/private/secret.txt 에 액세스 할 수 없습니다.

3. Selinux 또는 보안 모듈 제한

일부 Linux 시스템에는 Selinux 또는 Apparmor가 활성화되어 있으며 파일 권한이 "정상"인 것으로 보이더라도 시스템 정책에 의해 제한 될 수 있습니다.

다음 명령을 사용하여 Selinux의 제한 사항을 확인할 수 있습니다.

 ls -Z /path/to/file

3. 솔루션

1. 파일 권한을 확인하고 수정하십시오

대상 파일에 PHP 사용자에게 권한을 읽었는지 확인하십시오. 가장 쉬운 방법은 파일 권한을 644 로 설정하고 PHP 사용자도 디렉토리에 대한 권한을 갖도록하는 것입니다.

 chmod 644 /path/to/file.txt
chown www-data:www-data /path/to/file.txt

2. PHP 사용자의 액세스 권한을 확인하십시오

다음 PHP 코드를 통해 현재 집행자 사용자를 일시적으로 디버깅 할 수 있습니다.

 echo get_current_user(); // 또는 사용 posix_geteuid()

사용자가 대상 파일 및 디렉토리에 액세스 할 수있는 권한이 있는지 확인하십시오.

3. is_readable ()을 사용하여 가독성을 감지하십시오

md5_file ()을 호출하기 전에 직접 오류를 피하기 위해 파일을 읽을 수 있는지 확인하십시오.

 $file = '/var/data/file.txt';
if (is_readable($file)) {
    $hash = md5_file($file);
    echo "Hash: $hash";
} else {
    echo "파일을 읽을 수 없습니다,권한을 확인하십시오";
}

4. 시스템 보안 정책을 확인하십시오

Selinux 활성화 시스템에있는 경우 CHCON 명령을 통해 컨텍스트를 수정해야 할 수도 있습니다.

 chcon -t httpd_sys_content_t /path/to/file.txt

또는 Selinux 테스트를 일시적으로 종료합니다 (생산 환경에는 권장되지 않음) :

 setenforce 0

4. 기타 제안 및 예방 조치

  • cdn 또는 https://m66.net/files/check.txt 와 같은 원격 주소를 사용하는 경우 md5_file () 도 실패합니다. 로컬 파일 경로 만 처리 할 수 ​​있고 URL을 처리 할 수 ​​없기 때문입니다. 원격 파일을 먼저 다운로드 한 다음 다음 방법을 사용하여 처리 할 수 ​​있습니다.

 error_reporting = E_ALL
display_errors = On