2014-06-12 12 views
1

새로운 "setPassword"방법은 (내가 잘못 이해하지 않는 한) 적용되지 않습니다.ZipArchive :: 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(); 

그것은 않습니다 인쇄 "OK"PHP의 5.6.0beta3에서 (데비안 테스트)하지만, zip 파일의 암호 가 없습니다.

무엇이 누락 되었습니까?

+0

PHP 코어 개발자에게 다시 먹여 봤습니까? 그들은 몇 주 동안 새로운 PHP56 기능에 대한 테스트 피드백을 요청했습니다. –

+0

실제로는 없습니다. 나는 그것에 대해 생각 해왔다. 내 코드가 어리 석거나 진짜 버그인지 확신 할 수 없다 ... –

+0

아마도 setPassword()가 파일을 추가했는지 테스트하기 위해 코드를 수정할 가치가있다.하지만 확실히 버그 일 가능성이있다. 결국 새로운 기능이며 setPassword를 테스트하기위한 phpt 파일이 보이지 않습니다. –

답변

0

나는 ZipArchive :: setPassword() 메소드를 우회하는 방법을 발견했다.

#!/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 코드에서 간부를 사용할 수 있습니다 :

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

그것은 기대 zipcloak 설치되어있는 리눅스 서버에서만 작동 단순히 쉘 스크립트를 썼다.