PHP에서 다운로드 할 때 Word / Excel 파일이 손상됨

rgbflawed

데이터베이스에 간단한 파일 업로드 / 파일 다운로드 기능을 구축하고 있습니다. 유일한 복잡한 부분은 모든 파일이 내 멋진 암호화 방법을 사용하여 암호화되어야한다는 것입니다.

그래서 내가하는 일은 id_file, 파일 이름, 확장자, 크기, dateadded 등을 저장하는 SQL 항목을 만드는 것입니다.

그런 다음 id_file을 얻었 으면 파일 내용을 가져 와서 암호화 한 다음 내 서버에 [id_file] .txt로 저장합니다.

다음은 파일을 다시 다운로드하기위한 코드입니다.

header("Pragma: public");
header('Content-Disposition: attachment;filename="'.$file['name'].'.'.$file['extension'].'"');
header('Cache-Control: max-age=0');

echo someFunctionIMadeForGettingAndDecryptingFileContents($_GET['id_file']);

exit;

정말 간단하고 .docx 및 .xlsx를 제외한 모든 파일 유형에 대해 완벽하게 작동합니다. .docx 또는 .xlsx 파일을 다운로드 할 때 Office에서 ""파일 이름 "에서 읽을 수없는 내용을 찾았습니다.이 문서의 내용을 복구 하시겠습니까? 소스를 신뢰하는 경우 ... bla bla"라는 오류 메시지가 표시됩니다. '예'를 클릭하십시오. 약간 생각하고 파일이 잘 열립니다. 그러나 분명히 매번 오류가 발생하면 클라이언트가 이것을 사용하도록 할 수 없습니다.

내가 작성한 코드는 다른 모든 파일 유형에서 완벽하게 작동합니다. .doc, .xls 및 .zip 파일도 잘 작동합니다.

첫 번째 생각은 헤더를 보는 것이 었습니다. 여기에 나열된 것과 같은 모든 종류의 솔루션을 시도했습니다.

다운로드 한 파일이 항상 손상되거나 손상된 이유는 무엇입니까? PHP 다운로드 엑셀 파일이 손상됨

작동하지 않았습니다.

파일에 추가 패딩이나 공백이 추가되는 문제가있을 수 있다는 것을 알고 있습니다. 하지만 .txt 파일을 업로드 한 다음 다시 다운로드하면 추가 할 항목이 없음을 알 수 있습니다.

원본 파일 (good.docx)과 다운로드 한 원본 파일 (bad.docx) 버전을 MD5하면 해시가 다릅니다.

good.docx를 good.zip으로 변경하고 아카이브의 압축을 풉니 다. 그런 다음 bad.docx에 대해서도 동일하게 수행합니다. 그런 다음 MD5 두 디렉토리, 해시는 동일합니다. 그리고 각 파일을 good.zip과 bad.zip 안에 해시했으며 각 파일 해시는 동일합니다.

또한 내 서버의 다른 곳에서는 PHPWord와 PHPExcel을 사용하여 Office 파일을 동적으로 생성하고 해당 파일은 모두 다운로드가 잘됩니다. PHPExcel에 사용하는 헤더 / 코드는 다음과 같습니다.

header("Pragma: public");
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$filename.'.xlsx"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit;

(예, 위의 다른 코드에서 "Content-Type"헤더를 사용해 보았지만 도움이되지 않았습니다.)

또한 내 서버에 파일을 저장하고 다운로드 한 다음 열어 보았습니다. 해당 프로세스를 진행할 때 동일한 오류가 발생합니다. 이를 수행하는 데 사용한 코드는 다음과 같습니다.

$f=fopen("/myPath/temp.docx","w");
fwrite($f,someFunctionIMadeForGettingAndDecryptingFileContents($_GET['id_file']));
fclose($f);
exit;

"blank.docx"라는 빈 Word 파일을 만들어 보았습니다. 그런 다음 새 파일을 저장하는 기능 대신에 그렇게 만들었습니다 .... blank.docx의 내용을 해독 된 파일 내용으로 대체합니다. 그러나 그 프로세스 후에 blank.docx를 다운로드 할 때 나는 모두 똑같이 ... 오류가 발생하지만 결국 열립니다. 원래 blank.docx에 있던 파일 속성 (예 : Template : Normal.dotm)은 제공된 수정 된 blank.docx에 없습니다.

Office 2007을 사용하고 있습니다.

최신 정보

다음은 파일의 좋은 (원본) 버전을 다운로드 할 수있는 링크입니다. http://empowerdb.org/good.docx

다음은 파일의 잘못된 (처리 된) 버전을 다운로드 할 수있는 링크입니다. http://empowerdb.org/bad.docx

해결책

Llama 씨가 아래에서 지적했듯이 내 암호화 기능이 여분의 널 바이트를 제거했습니다. 하지만 범인은 생각만큼 분명하지 않다는 것이 밝혀졌습니다. 내 암호화는 다음과 같습니다.

trim(base64_encode(IV.mcrypt_encrypt(MCRYPT_RIJNDAEL_128,ENCKEY,$contents,MCRYPT_MODE_CBC,IV)))

문제는 trim () 또는 base64_encode ()가 아닙니다. mcrypt 기능을 사용했습니다. 이 문제를 해결 한 방법은 파일 내용을 암호화하여 전달하기 전에 다른 base64_encode ()를 수행했습니다. 그래서 이렇게 ...

$file_contents_encrypted=base64_encode(myEncryptionFunction($file_contents));

물론 해독시 그 반대입니다.

base64_encode는 기술적으로 두 번 실행됩니다. 하지만 .docx 및 .xlsx와 같은 고유 한 zip 형식으로 인해 mcrypt 전에이 경우 실행해야하는 방법을 알 수 있습니다.

라마 씨

암호 해독 기능이 파일 끝에서 널 바이트를 제거합니다.

good.docx파일은 네 가지로 끝나는 0x00그동안 바이트 bad.docx파일 끝 없음으로. 누락 된 바이트를 제외하고 파일은 동일합니다 .

$ wc -c good.docx
25123 good.docx

$ wc -c bad.docx
25119 bad.docx

$ tail -c 32 good.docx | od -x
0000000 6666 6365 7374 782e 6c6d 4b50 0605 0000
0000020 0000 0010 0010 041c 0000 5df1 0000 0000

$ tail -c 32 bad.docx | od -x
0000000 7469 4568 6666 6365 7374 782e 6c6d 4b50
0000020 0605 0000 0000 0010 0010 041c 0000 5df1

의 마지막 4 바이트를 건너 뛰면 good.docxmd5 합계가 정확히 일치합니다.

$ head -c -4 good.docx | md5sum
fbd32fbcc02d62dfd8bd39d390252a4b *-

$ cat bad.docx | md5sum
fbd32fbcc02d62dfd8bd39d390252a4b *-

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

S3에서 다운로드 할 때 Excel 파일이 손상됨

분류에서Dev

클라이언트 측에서 다운로드 할 때 xlsm 파일이 손상됨

분류에서Dev

C #을 통해 다운로드 할 때 PDF 파일이 손상됨

분류에서Dev

Google Apps Script에서 Blob으로 변환 할 때 .xlsx 파일이 손상됨

분류에서Dev

C # SFTP-파일 SFTP 서버를 비교할 때 다운로드 파일이 손상되고 다른 크기가 표시됨

분류에서Dev

MS Word 파일 (.docx)에서 HTML 코드 렌더링-파일이 손상됨

분류에서Dev

PHP 다운로드 후 mobi 파일이 손상됨

분류에서Dev

서버에 업로드 할 때 파일 코드 형식이 손실 됨

분류에서Dev

로컬 호스트에서 TwitterOAuth를 사용할 때 현재 PHP AppEngine이 손상됨

분류에서Dev

.NET Core에서 pdf 파일 다운로드가 손상됨

분류에서Dev

GitHub에 파일을 게시 할 때 메모장 ++ 및 VS 코드에서 정상으로 보일 때 들여 쓰기가 손상됨

분류에서Dev

Apache POI로 Android에서 덮어 쓴 후 Excel 파일이 손상됨

분류에서Dev

React에서 Axios를 사용하여 S3 (PUT)에 업로드 할 때 데이터가 손상됨

분류에서Dev

OleContainer로 저장할 때 손상된 Excel 파일

분류에서Dev

Elastic Beantalk에 배포 할 때 Angular 모듈이 손상됨

분류에서Dev

html "<a> Download </a>"에서 앵커를 클릭 할 때 Excel 파일을 다운로드하려고합니다.

분류에서Dev

putObject를 사용할 때 S3 파일이 손상됨

분류에서Dev

ASP.NET에서 다운로드 할 때 파일이 다른 이유 (Blob으로 AJAX 다운로드)

분류에서Dev

nano 편집기 또는 메일 (postfix) 명령을 사용할 때 rsync 로그 파일이 손상됨

분류에서Dev

Ajax를 통해 Dropbox에 업로드 할 때 손상된 파일

분류에서Dev

파일에서 읽을 때 문자열이 손상됨

분류에서Dev

PHP 파일 업로드 후 파일이 손상됨

분류에서Dev

files.upload API를 사용하여 Excel을 Slack에 업로드-파일이 업로드되지만 손상됨

분류에서Dev

div에 대한 코드를 CSS에 추가 할 때 탐색 모음이 손상됨

분류에서Dev

ksh에서 SQL 쿼리의 출력을 추가 할 때 출력이 손상됨

분류에서Dev

다운로드에서 파일을 선택할 때 충돌

분류에서Dev

laravel에서 PDF 파일을 다운로드하려고 할 때 이상한 문자가있는 파일을 여는 이유는 무엇입니까?

분류에서Dev

Word 파일에서 Excel 파일로 복사 할 표 선택

분류에서Dev

openpyxl에 저장하려고 할 때 주요 오류-Excel 파일 손상

Related 관련 기사

  1. 1

    S3에서 다운로드 할 때 Excel 파일이 손상됨

  2. 2

    클라이언트 측에서 다운로드 할 때 xlsm 파일이 손상됨

  3. 3

    C #을 통해 다운로드 할 때 PDF 파일이 손상됨

  4. 4

    Google Apps Script에서 Blob으로 변환 할 때 .xlsx 파일이 손상됨

  5. 5

    C # SFTP-파일 SFTP 서버를 비교할 때 다운로드 파일이 손상되고 다른 크기가 표시됨

  6. 6

    MS Word 파일 (.docx)에서 HTML 코드 렌더링-파일이 손상됨

  7. 7

    PHP 다운로드 후 mobi 파일이 손상됨

  8. 8

    서버에 업로드 할 때 파일 코드 형식이 손실 됨

  9. 9

    로컬 호스트에서 TwitterOAuth를 사용할 때 현재 PHP AppEngine이 손상됨

  10. 10

    .NET Core에서 pdf 파일 다운로드가 손상됨

  11. 11

    GitHub에 파일을 게시 할 때 메모장 ++ 및 VS 코드에서 정상으로 보일 때 들여 쓰기가 손상됨

  12. 12

    Apache POI로 Android에서 덮어 쓴 후 Excel 파일이 손상됨

  13. 13

    React에서 Axios를 사용하여 S3 (PUT)에 업로드 할 때 데이터가 손상됨

  14. 14

    OleContainer로 저장할 때 손상된 Excel 파일

  15. 15

    Elastic Beantalk에 배포 할 때 Angular 모듈이 손상됨

  16. 16

    html "<a> Download </a>"에서 앵커를 클릭 할 때 Excel 파일을 다운로드하려고합니다.

  17. 17

    putObject를 사용할 때 S3 파일이 손상됨

  18. 18

    ASP.NET에서 다운로드 할 때 파일이 다른 이유 (Blob으로 AJAX 다운로드)

  19. 19

    nano 편집기 또는 메일 (postfix) 명령을 사용할 때 rsync 로그 파일이 손상됨

  20. 20

    Ajax를 통해 Dropbox에 업로드 할 때 손상된 파일

  21. 21

    파일에서 읽을 때 문자열이 손상됨

  22. 22

    PHP 파일 업로드 후 파일이 손상됨

  23. 23

    files.upload API를 사용하여 Excel을 Slack에 업로드-파일이 업로드되지만 손상됨

  24. 24

    div에 대한 코드를 CSS에 추가 할 때 탐색 모음이 손상됨

  25. 25

    ksh에서 SQL 쿼리의 출력을 추가 할 때 출력이 손상됨

  26. 26

    다운로드에서 파일을 선택할 때 충돌

  27. 27

    laravel에서 PDF 파일을 다운로드하려고 할 때 이상한 문자가있는 파일을 여는 이유는 무엇입니까?

  28. 28

    Word 파일에서 Excel 파일로 복사 할 표 선택

  29. 29

    openpyxl에 저장하려고 할 때 주요 오류-Excel 파일 손상

뜨겁다태그

보관