ZIP-файл и защитить паролем в PHP

У меня есть этот код для zip-файлов, но мне нужно защитить этот файл паролем

$file = 'backup.sql'; $zipname = $file.'.zip'; $zip = new ZipArchive; $zip->open($zipname, ZipArchive::CREATE); ZipArchive::setPassword('123456'); //$zip->setPassword("123456"); $zip->addFile($file); $zip->close(); 

когда я использую $ zip-> setPassword, я не получаю никаких ошибок, но файл вообще не защищен, и когда я использую ZipArchive :: setPassword, я получаю эту ошибку »Неустранимая ошибка: нестатический метод ZipArchive :: setPassword () не может называть статически "

Итак, как закрепить файл в php и защитить его паролем?

Да, создание защищенных паролем архивов не поддерживается (они будут созданы просто как незащищенные архивы).
Но все же его можно использовать для извлечения защищенных паролем архивов.

Возвращаясь к проблеме.
Вы всегда можете просто

 <?php echo system('zip -P pass file.zip file.txt'); ?> 

(это будет работать как на Windows, так и на нашем любимом Linux)

Но, если это не соответствует вашим требованиям, давайте продолжим.
Я бы предложил вам использовать DotNetZip (только для Windows), вы будете точно динамически генерировать зашифрованные ZIP-архивы AES с PHP.

 <?php // origin: https://stackoverflow.com/a/670804/3684575 try { $fname = "zip-generated-from-php-" . date('Ymd-His') . ".zip"; $zipOutput = "c:\\temp\\" . $fname; $zipfact = new COM("Ionic.Zip.ZipFile"); $zip->Name = $zipOutput; $dirToZip= "c:\\temp\\psh"; # Encryption: 3 => 256-bit AES. # 2 => 128-bit AES. # 1 => PKZIP (Weak). # 0 => None $zip->Encryption = 3; $zip->Password = "AES-Encryption-Is-Secure"; $zip->AddDirectory($dirToZip); $zip->Save(); $zip->Dispose(); if (file_exists($zipOutput)) { header('Cache-Control: no-cache, must-revalidate'); header('Content-Type: application/x-zip'); header('Content-Disposition: attachment; filename=' . $fname); header('Content-Length: ' . filesize($zipOutput)); readfile($zipOutput); unlink($zipOutput); } else { echo '<html>'; echo ' <head>'; echo ' <title>Calling DotNetZip from PHP through COM</title>'; echo ' <link rel="stylesheet" href="basic.css"/>'; echo ' </head>'; echo '<body>'; echo '<h2>Whoops!</h2>' . "<br/>\n"; echo '<p>The file was not successfully generated.</p>'; echo '</body>'; echo '</html>'; } } catch (Exception $e) { echo '<html>'; echo ' <head>'; echo ' <title>Calling DotNetZip from PHP through COM</title>'; echo ' <link rel="stylesheet" href="basic.css"/>'; echo ' </head>'; echo '<body>'; echo '<h2>Whoops!</h2>' . "<br/>\n"; echo '<p>The file was not successfully generated.</p>'; echo '<p>Caught exception: ', $e->getMessage(), '</p>', "\n"; echo '<pre>'; echo $e->getTraceAsString(), "\n"; echo '</pre>'; echo '</body>'; echo '</html>'; } ?> 

Но все же это очень грязное решение, и многое другое, а не работает в Linux.

Итак , хотя PHP является зрелым языком, нет адекватного метода (исключая пользовательское расширение или что-то в этом роде) для достижения такой простой задачи с помощью чистого PHP.
То, что вы также можете сделать, – дождаться, пока PHP 7.2 будет доступен для производства (cuz ZipArchive :: setEncryptionName реализовано (благодаря Пьеру и Реми)).
Но до тех пор вы также можете попытаться перенести php_zip > = 1.14.0 в PHP <7.2, но в настоящее время нет скомпилированных двоичных файлов, поэтому вы должны сами их скомпилировать и попробовать, если это вообще возможно (я считаю, что это ).
ps Я бы попробовал, но у меня нет VS2015 + на моем ПК прямо сейчас.

ZipArchive :: setPassword Эта функция устанавливает только пароль, который будет использоваться для распаковки архива; он не превращает ZipArchive, не защищенный паролем, в защищенный паролем ZipArchive.

рабочий код:

$ file = 'file_name_to_be_compressed.extension'

system ('zip -P ZIP_PASSWORD'. $ file. '. zip'. $ file);

Как описано в документации :

Эта функция устанавливает только пароль, который будет использоваться для распаковки архива; он не превращает ZipArchive, не защищенный паролем, в защищенный паролем ZipArchive.

Если вы хотите зашифровать zip-архив, я бы предложил Google немного 🙂