web-dev-qa-db-ja.com

ファイルを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で圧縮し、パスワードで保護するにはどうすればよいでしょうか。

4
PHP User

はい、パスワードで保護されたアーカイブの作成はサポートされていません(保護されていないアーカイブとして作成されます)。
ただし、パスワードで保護されたアーカイブを抽出するために使用することはできます。

問題に戻ります。
あなたはいつでも

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

(これはWindowsと私たちの最愛のLinuxの両方で動作します)

ただし、要件に合わない場合は、続行しましょう。
DotNetZip (Windowsのみ)を使用することをお勧めします。PHPからAES暗号化Zipアーカイブを正確に動的に生成します。

<?php
// Origin: https://stackoverflow.com/a/670804/3684575
try
{
  $fname = "Zip-generated-from-php-" . date('Y-m-d-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では機能しません。

So、PHPは成熟した言語ですが、適切な方法はありません(カスタム拡張などを除く)純粋なPHPでこのような単純なタスクを実行します。
あなたもできることは、 PHP 7.2 が本番環境で利用可能になるまで待つことです(cuz ZipArchive :: setEncryptionName が実装されます(PierreとRemiに感謝します) ))。
ただし、それまでは、 php_Zip > = 1.14.0をPHP <7.2に移植することもできますが、現在、コンパイル済みのバイナリはありません。なので、自分でコンパイルして、可能かどうか試してみる必要があります(そうだと思います)。
p.s。試してみますが、現在PCにVS2015 +がありません。

4
Abraham Tugalov

PHP 7.2を使用して、パスワードで保護されたZipファイルを作成します。

$Zip = new ZipArchive;
$res = $Zip->open('filename.Zip', ZipArchive::CREATE); //Add your file name
if ($res === TRUE) {
   $Zip->addFromString('FILENAME_WITH_EXTENSION', 'file content goes here'); //Add your file name
   $Zip->setEncryptionName('FILENAME_WITH_EXTENSION', ZipArchive::EM_AES_256, 'PASSWORD'); //Add file name and password dynamically
   $Zip->close();
   echo 'ok';
} else {
   echo 'failed';
}
9

ZipArchive :: setPassword この関数は、アーカイブの解凍に使用するパスワードのみを設定します。パスワードで保護されていないZipArchiveをパスワードで保護されたZipArchiveに変えることはありません。

作業コード:

$ file = 'file_name_to_be_compressed.extension'

system( 'Zip -PZip_PASSWORD'。$ file。 '。Zip'。$ file);

2
Sitethief

PHP 7.2)以降、 setEncryptionName を使用して、パスワードで保護されたZipアーカイブを作成できます。

1
lubosdz

ドキュメント で説明されているように:

この関数は、アーカイブの解凍に使用するパスワードのみを設定します。パスワードで保護されていないZipArchiveをパスワードで保護されたZipArchiveに変えることはありません。

Zipアーカイブを暗号化したい場合は、グーグルを少しお勧めします :)

0
TheRealVira