PHPでは、ZIPファイルを操作する場合、 Zip_Read()関数を使用します。これは、Ziparchiveクラスの一部に属し、主にZIPパッケージのファイルエントリを通過および読み取りに使用されます。ただし、暗号化されたZIPファイルに遭遇した場合、多くの開発者は、 ZIP_READ()で読むことに失敗するか、単に暗号化されたコンテンツにアクセスできないことがわかります。では、なぜこれがあるのですか?この記事では、PHPのZIP拡張メカニズムを組み合わせて、この問題の原因とそのソリューションを詳細に分析します。
$zip = zip_open('encrypted.zip');
if ($zip) {
while ($entry = zip_read($zip)) {
echo zip_entry_name($entry) . "\n";
if (zip_entry_open($zip, $entry)) {
echo zip_entry_read($entry, zip_entry_filesize($entry));
zip_entry_close($entry);
}
}
zip_close($zip);
}
上記のコードは通常、通常のzipファイルを読み取るときに機能しますが、暗号化されたzipファイルに遭遇すると、以下の問題がしばしば発生します。
ファイルの内容を読み取れないため、 zip_entry_read()は空の文字列またはエラーを返します。
zip_read()がfalseを返すと表示されるファイルエントリに移動することさえできません。
Zip_read()は、 PHPのLibzipライブラリ(ZIPファイルに基づく低レベル操作)の古いインターフェイスに属し、暗号化されたファイルコンテンツの復号化をネイティブにサポートしていません。暗号化されたzipファイル(通常はパスワードで保護されている)ファイルデータを暗号化する方法を使用すると、データは単純なテキストに保存されていません。
zip_read()は、 zipファイルのファイルエントリと誘惑されていないファイルコンテンツのみにのみアクセスできます。
zipファイルが暗号化されている場合、zip拡張機能は、対応する復号化ロジックを呼び出して、正しいパスワードを提供してファイルを正しく読み取る必要があります。
PHPのZIP_READ()は、パスワードパラメーターを提供せず、自動復号化をサポートしません。
要するに、 zip_read()は、設計の暗号化されたファイルの読み取りをサポートしていません。
バージョン7.2で始まるPHPからのZIP拡張機能は、暗号化されたファイルを読むためのパスワードの設定をサポートするより完全なZiparchiveクラスを提供します。
$zip = new ZipArchive();
$res = $zip->open('encrypted.zip');
if ($res === true) {
// パスワードを設定します
$zip->setPassword('your_password');
for ($i = 0; $i < $zip->numFiles; $i++) {
$stat = $zip->statIndex($i);
echo "File: " . $stat['name'] . "\n";
$stream = $zip->getStream($stat['name']);
if (!$stream) {
echo "Failed to open stream for {$stat['name']}\n";
continue;
}
$contents = stream_get_contents($stream);
fclose($stream);
echo $contents;
}
$zip->close();
} else {
echo "Failed to open zip file\n";
}
キーノート:
SetPassWord()メソッドは、復号化に必要なパスワードを提供するために使用されます。
GetStream()を使用して、パスワードが正しい場合は、暗号化されたファイルのコンテンツストリームを取得します。
この方法では、暗号化されたzipファイルの内容を正常に読み取ることができます。
ZIP_READ()は、初期のPHPのZIP操作インターフェイスであり、暗号化されたファイルを処理できません。
暗号化されたZIPファイルは、Ziparchiveなどのパスワード復号化をサポートするインターフェイスを使用する必要があります。
Ziparchive :: SetPassWord()を使用すると、PHPは暗号化されたファイルを正常に開いて読み取ることができます。
実際の開発では、暗号化されたZIPファイルに遭遇したときにZiparchiveクラスを使用して、時代遅れのZIP_READ()を使用しないようにすることをお勧めします。