PHPでは、 MD5_FILE()関数は、特に圧縮パッケージなどの重要なファイルの整合性検証のために、ファイルの整合性を検証するためによく使用されます。ファイルのMD5ハッシュ値を計算して、ファイルが改ざんされているか破損しているかを判断します。非常にシンプルで便利に見えますが、実際に使用するときに無視できる落とし穴もいくつかあります。この記事では、MD5_FILE()を使用して圧縮パッケージの整合性を確認するときに注意する必要があるいくつかの重要なポイントを詳細に説明します。
MD5_FILE()はファイルへのフルパスにアクセスできる必要があり、PHPプロセスには読み取り許可が必要です。パスが間違っている場合、またはアクセス許可が不十分な場合、関数は例外をスローしません。これは簡単に無視され、検証障害を引き起こします。
$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()はストリーム操作に基づいており、メモリを保存しますが、限られたメモリ環境またはスクリプト実行時間制限の下でエラーまたはタイムアウトを引き起こす可能性があります。 Chunked Readingを検討したり、コマンドラインツールアシスタンスを使用したりできます。
一部のシステムでは、特にクロスプラットフォーム伝送の場合、ファイルエンコードやラインブレークなどの微妙な違いが同じ圧縮パッケージの一貫性のないMD5値を引き起こす可能性があります。アップロードされた圧縮パケットが2回処理されないか、圧縮形式が変更されないことを確認してください。
MD5アルゴリズムは、衝突リスクがあることが証明されています。セキュリティ要件が非常に高いシナリオでは、圧縮パッケージのMD5値を偽造することは困難ですが、PHPのhash_file()に置き換えることができるSHA-256などのより安全なハッシュアルゴリズムを使用することをお勧めします。
$sha256 = hash_file('sha256', '/path/to/archive.zip');
echo "圧縮パッケージSHA-256: $sha256";
圧縮パッケージのファイル構造の変更は、圧縮パッケージファイル全体のMD5値に影響しませんが、圧縮パッケージ内の各ファイルの整合性を検出する必要がある場合は、 MD5_FILE()を使用するだけでは不十分であり、内部ファイルの減圧操作と検証と組み合わせる必要があります。