PHP에서 MD5_FILE () 함수는 종종 파일의 무결성, 특히 압축 패키지와 같은 중요한 파일의 무결성 검증을 위해 파일의 무결성을 확인하는 데 사용됩니다. 파일의 MD5 해시 값을 계산하여 파일이 변조되었는지 또는 손상되었는지 여부를 결정합니다. 매우 간단하고 편리해 보이지만 실제로 사용할 때 무시하기 쉬운 함정도 있습니다. 이 기사는 압축 패키지의 무결성을 확인하기 위해 MD5_File ()을 사용할 때주의를 기울여야하는 몇 가지 핵심 사항을 자세히 설명합니다.
MD5_FILE ()는 파일의 전체 경로에 액세스 할 수 있어야하며 PHP 프로세스에는 읽기 권한이 있어야합니다. 그렇지 않으면 False가 반환됩니다. 경로가 잘못되었거나 권한이 불충분 한 경우 함수는 예외가 발생하지 않으므로 쉽게 무시하고 검증 실패를 유발합니다.
$filePath = '/path/to/archive.zip';
$md5 = md5_file("http://m66.net/archive.zip"); // 이것은 네트워크 경로입니다,반드시 지원되는 것은 아닙니다
if ($md5 === false) {
echo "파일을 읽을 수 없거나 존재하지 않습니다!";
} else {
echo "문서MD5: $md5";
}
참고 : md5_file ()는 로컬 파일에 가장 적합합니다. URL을 사용하는 경우 서버는 allow_url_fopen을 통해 원격 파일에 액세스 할 수 있어야합니다. 그렇지 않으면 실패합니다.
URL을 사용하여 직접 MD5 값을 계산하는 것은 신뢰할 수 없습니다. 네트워크 지연, 임시 연결 끊기 등으로 인해 원격 파일을 불완전하게 읽을 수 있습니다. 먼저 파일을 로컬로 다운로드 한 다음 MD5_File ()을 사용하여 계산하는 것이 좋습니다.
$url = 'http://m66.net/archive.zip';
$localFile = '/tmp/archive.zip';
// 下载문서
file_put_contents($localFile, file_get_contents($url));
// 믿다 MD5
$md5 = md5_file($localFile);
echo "압축 패키지MD5: $md5";
큰 파일의 경우 파일을 직접 읽고 MD5 값을 계산하십시오. md5_file () 은 스트림 작동을 기반으로하고 메모리를 저장하지만 제한된 메모리 환경 또는 스크립트 실행 시간 제한에서 오류 또는 시간 초과를 유발할 수 있습니다. 청크 판독 또는 명령 줄 도구 지원을 고려할 수 있습니다.
일부 시스템에서는 파일 인코딩 및 라인 브레이크와 같은 미묘한 차이로 인해 특히 크로스 플랫폼 전송이있을 때 동일한 압축 패키지의 MD5 값이 일관되지 않을 수 있습니다. 업로드 된 압축 패킷이 두 번 처리되지 않거나 압축 형식이 변경되지 않도록하십시오.
MD5 알고리즘은 충돌 위험이있는 것으로 입증되었습니다. 압축 패키지의 MD5 값을 위조하기는 어렵지만 보안 요구 사항이 매우 높은 시나리오에서는 PHP의 Hash_File () 로 대체 할 수있는 SHA-256과 같은보다 안전한 해시 알고리즘을 사용하는 것이 좋습니다.
$sha256 = hash_file('sha256', '/path/to/archive.zip');
echo "압축 패키지SHA-256: $sha256";
압축 패키지의 파일 구조의 변경 사항은 전체 압축 패키지 파일의 MD5 값에 영향을 미치지 않지만 압축 패키지 내부의 각 파일의 무결성을 감지 해야하는 경우 MD5_File ()을 사용하여 충분하지 않으며 내부 파일의 감압 작업 및 확인과 결합해야합니다.