【问题标题】:ZipArchive::setPassword doesn't set a password to my newly created fileZipArchive::setPassword 没有为我新创建的文件设置密码
【发布时间】:2014-06-12 17:30:28
【问题描述】:

新的“setPassword”方法不生效(除非我理解错了)。

这是我的示例代码:

<?php
$zipFilePath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'filename.zip';
$password = 'P455W0RD';

if (file_exists($zipFilePath)) {
    unlink($zipFilePath);
}

$zipArchive = new ZipArchive();
$zipArchive->open($zipFilePath, ZipArchive::CREATE);

if ($zipArchive->setPassword($password)) {
    echo 'OK' . PHP_EOL;
}

foreach (range(1, 10) as $fileNumber) {
    $zipArchive->addFromString('file' . $fileNumber . '.txt', rand());
}

$zipArchive->close();

它在 PHP 5.6.0beta3 (Debian 测试) 中打印“OK”,但没有密码 在 zip 文件中。

我错过了什么?

【问题讨论】:

  • 您是否已将此反馈给 PHP 核心开发人员?好几个星期以来,他们一直在征求对 PHP56 新特性的测试反馈
  • 其实没有。我一直在考虑。我不确定我的代码是愚蠢的还是真正的错误......
  • 也许值得修改您的代码以测试 setPassword() 是否在 添加文件之后工作......但它肯定有可能是一个错误:这是一个新功能之后全部,我没有看到任何用于测试 setPassword 的 phpt 文件
  • 不,添加文件后不起作用。我会向他们报告的。谢谢!
  • 即使您正在做的只是一些愚蠢的事情,记录问题也应该提醒团队在 php 文档中解释如何正确使用它

标签: php passwords zip ziparchive


【解决方案1】:

我找到了绕过 ZipArchive::setPassword() 方法的方法。我只是写了一个shell脚本:

#!/bin/bash
command -v zipcloak && echo "exist" || exit -1;
command -v expect && echo "exist" || exit -1;
MYPWD="[password]"
expect -c ' 
spawn zipcloak [filename]
expect "*Enter password*" 
sleep 0.1
send  "'"$MYPWD"'\r"
sleep 0.1
expect "*Verify password*" 
sleep 0.1
send  "'"$MYPWD"'\r"
sleep 0.1
'

我可以简单地从我的 php 代码中使用 exec:

public function encryptZip($filename, $password, $bashdir){
    $bash = str_replace('[filename]', $filename, (str_replace('[password]', $password, file_get_contents($bashdir))));
    exec($bash);
}

它只适用于安装了 expect 和 zipcloak 的 linux 服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多