>  기사  >  백엔드 개발  >  PHP 파일 업로드 문제 요약(파일 크기 감지, 대용량 파일 업로드 처리)_php 스킬

PHP 파일 업로드 문제 요약(파일 크기 감지, 대용량 파일 업로드 처리)_php 스킬

WBOY
WBOY원래의
2016-05-16 20:02:101669검색

로컬 및 서버 측면과 관련된 보안 문제로 인해 입력 유형="파일"을 기반으로 한 페이지 파일 업로드는 항상 어색한 위치에 있었습니다. 한편으로 사용자는 자신의 개인 정보가 유출되는 것을 원하지 않기 때문에 브라우저는 사용자가 업로드할 때 선택한 파일에 대해 효과적인 판단을 내릴 수 없습니다. 반면, 서버 측 보안과 전송 부담을 줄이기 위해 시스템에서는 사용자가 업로드를 시작하기 전에 불법 파일을 거부하기를 희망합니다.
시간이 지남에 따라 원래 입력 방법을 기반으로 한 업로드는 네트워크 스토리지 웹사이트에서 기피하는 레거시 문제가 되었으며, 이로 인해 온갖 종류의 이상한 플러그인과 업로드 클라이언트도 생성되었습니다.
업로드 입력방식이 그렇게 나쁜건가요? 물론 그렇지 않습니다. 파일을 업로드하는 경우에도 여전히 매우 간단하고 안정적입니다. PHP에서는

코드 복사 코드 형식만 필요합니다. 다음은 다음과 같습니다.
70f7b8a6783ff550881f98e4162d389c

입력 상자:
코드 복사 코드는 다음과 같습니다.
22391bf4ce1b171270048acf49b2c8e0

그리고 서버 측의 코드 한 줄:
코드를 복사하세요 코드는 다음과 같습니다:
move_uploaded_file($_FILES ['userfile']['tmp_name '], '/var/www/uploads/'.basename($_FILES['userfile']['name']));

전체 업로드 프로세스를 실현할 수 있습니다.
그러나 파일이 커지면 양식 업로드의 단점이 드러납니다. 특히, 지나치게 큰 파일 업로드를 방지하기 위해 최소 파일 크기를 확보한다는 단순한 아이디어가 너무 어려워졌습니다. 하나씩 살펴보겠습니다.
MAX_FILE_SIZE 통과
MAX_FILE_SIZE 숨김 필드(단위:바이트)는 파일 입력 필드 앞에 위치해야 하며 해당 값은 수신된 파일의 최대 크기입니다. 이는 브라우저에 대한 권장사항이며, PHP도 이를 확인합니다. 이 설정은 브라우저 측에서 쉽게 무시할 수 있으므로 이 기능을 사용하여 대용량 파일을 차단할 것으로 기대하지 마십시오. 실제로 PHP 설정의 최대 업로드 파일 크기는 만료되지 않습니다. 하지만 이 항목을 양식에 추가하는 것이 더 좋습니다. 사용자가 대용량 파일이 업로드될 때까지 기다리다가 파일이 너무 커서 업로드가 실패했음을 발견하는 데 시간을 소비하는 문제를 피할 수 있기 때문입니다.
분명히 PHP 개발자도 대용량 파일 업로드 문제를 고려했지만 매뉴얼에 나와 있듯이 MAX_FILE_SIZE는 브라우저에 대한 제안일 뿐이며 실제로 지금까지 모든 주류 브라우저는 이 제안을 채택하지 않았으므로 MAX_FILE_SIZE 제약 조건이 사용됩니다. 장식과 같아서 실현이 불가능합니다.
서버측을 통해
MAX_FILE_SIZE가 유효하지 않기 때문에 사용자가 서버에 파일을 업로드할 수 있습니다. 서버는 $_FILES['userfile']['size']를 통해 사용자가 업로드한 파일의 크기를 확인한 후 결정합니다. 업로드를 수락하고 정보를 반환할지 여부입니다. 서버에 대한 부하와 악의적인 방해 행위 가능성을 배제하면 이 솔루션은 대역폭 낭비에 지나지 않으며 사용자의 파일 업로드도 제한하는 것으로 보입니다.
그러나 이 역시 가능하지 않습니다. PHP 파일 업로드는 php.ini의 다음 설정에 영향을 받습니다.
  • post_max_size
  • upload_max_filesize
  • max_execution_time
  • 메모리_한계

매뉴얼에 설정 방법이 자세히 설명되어 있지만, 이 방법이 여전히 불가능한 이유는 PHP 실행 스크립트가 memory_limit를 초과하면 모든 POST 데이터가 손실되고 오류도 보고되지 않기 때문입니다!
사용자가 지나치게 긴 양식을 작성하고 이를 메모리 제한을 초과하는 파일과 함께 업로드한다고 가정해 보세요. 오랜 대기 시간 후에 그는 자신이 기다리고 있는 것이 또 다른 깔끔한 빈 양식이라는 것을 알게 됩니다. 정말 인상적인 사용자 경험입니다. 아. 게다가 수십 MB의 서버 트래픽은 파일 크기 감지에만 사용되는데, 이는 현재 네트워크 환경에서 허용되지 않습니다.
Javascript를 통해
Javascript는 브라우저를 기반으로 합니다. JS는 불가능해 보이는 많은 작업을 수행할 수 있지만 브라우저가 할 수 없는 작업은 JS가 할 수 없습니다. 본질적인 단점으로 인해 이 작업은 Javascript만으로는 불가능합니다. 그러나 일부 IE 전용 방법은 참조용으로 여전히 존재합니다.
플래시를 통해
Flash의 FileReference 클래스는 비교적 포괄적인 파일 처리 방법 세트를 제공합니다. 이제 대부분의 대용량 파일 업로드에는 Flash 기반 솔루션이 사용됩니다. Flash를 사용하여 Js와 상호작용하는 경우 클라이언트가 파일 크기를 감지할 수 있습니까? 대답은 '예'입니다.
먼저 플래시 파일에서 FileReference 클래스를 인스턴스화합니다.

var fr = new FileReference();

이 클래스를 기반으로 Flash에서 제공하는 파일 탐색 및 SelectFile 이벤트를 사용하여 브라우저 이벤트를 대체할 수 있습니다. 필요한 것:
1. 선택 파일 바인딩

fr.addEventListener(Event.SELECT, onSelectFile);

2. 플래시에서 얻은 파일 정보를 저장하기 위한 Js 액세스용 개체를 만듭니다

var s = {
 size:0,
 name:'',
 type:''
}

3. 파일 찾아보기 방법 생성

function browseFile():void {<br>
 fr.browse();<br>
}

4. SelectFile 이벤트가 발생하면 파일 정보를 전달합니다

function onSelectFile(e:Event):void {<br>
 s.size = fr.size;<br>
 s.name = fr.name;<br>
 s.type = fr.type;<br>
}

5. J가
를 호출할 수 있도록 browserFile 메소드를 공개하세요.

ExternalInterface.addCallback("browseFile", browseFile);

6. 획득한 파일 정보를 Js에 전달

ExternalInterface.call("onSelectFile",s);

이제 Js를 통해 플래시가 전달한 파일 크기 정보를 얻을 수 있습니다. 자세한 내용은 데모를 참조하세요.
결론
이제 문제가 해결된 것 같습니다. 파일 크기를 성공적으로 확인했습니다. 그렇죠? 하지만 이 글의 최종 결론은 플래시 기반의 파일 크기 검증은 여전히 ​​가능하지 않다는 것입니다.
파일 크기 확인의 유일한 목적은 업로드입니다. 위의 데모에서는 성공적으로 검증된 파일 이름이 입력 상자에 표시되는 것을 볼 수 있습니다. 업로드에 익숙한 학생들은 뭔가 부족하다고 생각하지 않나요? 그렇죠, 플래시를 통해서만 파일명을 얻을 수 있지만, 파일의 전체 경로를 얻을 수는 없고, 파일 경로는 입력으로 업로드하기 위한 필수 조건입니다. 따라서 Flash와 JS 상호 작용을 통해 파일 크기를 성공적으로 확인할 수 있지만 나중에 업로드하려면 계속해서 Flash만 사용할 수 있습니다.
플래시 개발이 보안상의 이유로 파일의 전체 경로를 차단하는 것은 이해할 수 있습니다. 그러나 파일 업로드, 특히 PHP 환경의 파일 확인 업로드 솔루션은 여전히 ​​최상의 솔루션이 없습니다.
물론 이를 보완할 수 있는 방법은 다양합니다.

Perl 기반 프로젝트 FileChucker, XUpload, Uber-Uploader
플래시 기반 프로젝트 SWFUpload
PHP를 직접 사용하여 서버에 멋진 소켓 링크를 생성하는 프로그램도 있습니다

하지만 결국에는 HTML만을 기반으로 구현할 수 있는 엄격하고 강력한 업로드 솔루션을 볼 수 있는 날이 멀지 않았으면 좋겠습니다.
마지막은 이 코드 다운로드입니다.
PHP 파일 업로드 크기 설정에 대한 자세한 설명
PHP를 사용하여 파일을 업로드할 때 가장 일반적인 문제는 대용량 파일을 업로드할 때 발생하는 오류입니다. 여기에는 PHP 구성 파일-php.ini
가 포함됩니다. 이 구성 파일에는 파일 업로드와 밀접하게 관련된 여러 값이 있습니다.

  • file_uploads = on //시스템에서 파일 업로드를 지원하는지 여부
  • upload_tmp_dir //임시 파일 저장 경로입니다. Linux에서는 시스템 기본 경로입니다.
  • upload_max_filesize = 2m //허용되는 최대 파일 업로드 크기
  • post_max_size = 2m //post 메소드를 PHP에 전달할 때 PHP가 허용할 수 있는 최대 데이터 용량

업로드하는 파일 크기가 8m 미만(보통)인 경우 위 설정을 수정하면 요구 사항을 충족할 수 있습니다.
하지만 8m를 초과하려면 위의 값 외에도 다른 두 값에 특별한 주의를 기울여야 합니다.

  • max_execution_time = 30 //각 스크립트가 실행되는 최대 시간(PHP를 업로드할 때 크기가 커서 시간 문제)
  • memory_limit = 8m //각 스크립트가 소비할 수 있는 최대 메모리

이 두 값을 더 크게 만들어 보세요. 일반적으로 이렇게 하면 대부분의 문제를 해결할 수 있습니다.

이를 통해 업로드되는 파일의 크기가 무한할 수 있음을 유추할 수 있습니다. 그러나 네트워크 상황 등도 고려하십시오.
php.net에서는 이 방법을 적용한 후에도 100m가 넘는 파일을 사용하면 여전히 오류가 발생한다고 하는 사람들이 있는데, 이것이 PHP 자체의 문제인지 궁금합니다.

이 문제에 대한 첫 번째 소개입니다. PHP 파일 업로드 문제를 해결하는 데 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.