PHP에서 MD5_FILE ()은 지정된 파일 컨텐츠의 MD5 해시 값을 계산하는 매우 실용적인 기능입니다. 기본 구문은 다음과 같습니다.
md5_file(string $filename, bool $binary = false): string|false
이 기능은 파일 확인, 캐싱 메커니즘, 파일 무결성 확인 및 기타 시나리오를 처리하는 데 매우 일반적입니다. 그러나 실제로 사용하는 동안 개발자는 혼란스러운 문제를 겪을 수 있습니다. 파일이 존재하고 경로가 정확하지만 md5_file ()는 false를 반환합니다. 일반적으로 파일 권한 문제 로 인해 발생합니다. 이 기사는 원인, 일반적인 시나리오 및 솔루션을 자세히 분석합니다.
MD5_FILE ()는 내부적으로 MD5 작업을 수행하기 위해 전체 파일 내용을 읽으려고합니다. 따라서 PHP 스크립트의 권한이 대상 파일을 읽기에 충분하지 않은 경우 함수는 False를 반환합니다.
md5_file () 의 경우 파일에는 "읽기 가능한 권한"이 있어야합니다. 여기에는 다음 차원이 포함됩니다.
파일 자체는 현재 실행 사용자 (예 : www-data )에게 읽을 수 있어야합니다.
모든 상위 수준 디렉토리에는 PHP가 경로에 액세스 할 수 있도록 "실행 권한"(즉, 입력 할 수 있음)이 있어야합니다.
Selinux, Apparmor와 같은 시스템 보안 모듈도 액세스 권한에 영향을 줄 수 있습니다.
파일 권한이 600 (소유자 읽기 가능하고 쓸 수 있음) 인 경우 PHP 실행 사용자가 파일의 소유자가 아닌 경우 파일을 읽지 않습니다.
-rw------- 1 root root 1024 May 28 10:00 secret.txt
PHP가 www-data 사용자로 실행되면 위 파일을 읽을 수 없으며 md5_file ()이 실패합니다.
파일 자체에 읽기 권한이 있더라도 디렉토리 권한으로 PHP가 입력 할 수없는 경우 파일에 액세스 할 수 없습니다.
drwx------ 2 user user 4096 May 28 10:00 /var/private/
이 경우 파일이 644 로 설정 되더라도 PHP는 /var/private/secret.txt 에 액세스 할 수 없습니다.
일부 Linux 시스템에는 Selinux 또는 Apparmor가 활성화되어 있으며 파일 권한이 "정상"인 것으로 보이더라도 시스템 정책에 의해 제한 될 수 있습니다.
다음 명령을 사용하여 Selinux의 제한 사항을 확인할 수 있습니다.
ls -Z /path/to/file
대상 파일에 PHP 사용자에게 권한을 읽었는지 확인하십시오. 가장 쉬운 방법은 파일 권한을 644 로 설정하고 PHP 사용자도 디렉토리에 대한 권한을 갖도록하는 것입니다.
chmod 644 /path/to/file.txt
chown www-data:www-data /path/to/file.txt
다음 PHP 코드를 통해 현재 집행자 사용자를 일시적으로 디버깅 할 수 있습니다.
echo get_current_user(); // 또는 사용 posix_geteuid()
사용자가 대상 파일 및 디렉토리에 액세스 할 수있는 권한이 있는지 확인하십시오.
md5_file ()을 호출하기 전에 직접 오류를 피하기 위해 파일을 읽을 수 있는지 확인하십시오.
$file = '/var/data/file.txt';
if (is_readable($file)) {
$hash = md5_file($file);
echo "Hash: $hash";
} else {
echo "파일을 읽을 수 없습니다,권한을 확인하십시오";
}
Selinux 활성화 시스템에있는 경우 CHCON 명령을 통해 컨텍스트를 수정해야 할 수도 있습니다.
chcon -t httpd_sys_content_t /path/to/file.txt
또는 Selinux 테스트를 일시적으로 종료합니다 (생산 환경에는 권장되지 않음) :
setenforce 0
cdn 또는 https://m66.net/files/check.txt 와 같은 원격 주소를 사용하는 경우 md5_file () 도 실패합니다. 로컬 파일 경로 만 처리 할 수 있고 URL을 처리 할 수 없기 때문입니다. 원격 파일을 먼저 다운로드 한 다음 다음 방법을 사용하여 처리 할 수 있습니다.
error_reporting = E_ALL
display_errors = On