>  기사  >  백엔드 개발  >  PHP 파일 크기 감지 및 대용량 파일 업로드 처리

PHP 파일 크기 감지 및 대용량 파일 업로드 처리

伊谢尔伦
伊谢尔伦원래의
2016-12-02 09:28:093371검색

로컬 및 서버 측면과 관련된 보안 문제로 인해 input type="file" 기반의 페이지 파일 업로드는 항상 어색한 위치에 있었습니다. 한편으로 사용자는 자신의 개인 정보가 유출되는 것을 원하지 않기 때문에 브라우저는 사용자가 업로드할 때 선택한 파일에 대해 효과적인 판단을 내릴 수 없습니다. 반면, 서버 측 보안과 전송 부담을 줄이기 위해 시스템에서는 사용자가 업로드를 시작하기 전에 불법 파일을 거부하기를 희망합니다.

시간이 지남에 따라 원래 입력 방법을 기반으로 한 업로드는 네트워크 스토리지 웹사이트에서 기피하는 레거시 문제가 되었으며, 이로 인해 온갖 종류의 이상한 플러그인과 업로드 클라이언트도 생성되었습니다.

업로드 입력방법이 그렇게 나쁜건가요? 물론 그렇지 않습니다. 파일을 업로드하는 경우에도 여전히 매우 간단하고 안정적입니다. PHP에서는 복합 형식(

<form enctype="multipart/form-data" action="__URL__" method="POST">

입력 상자:

<input name="userfile" type="file" />

)만 필요합니다. 끝에 있는 한 줄의 코드:

move_uploaded_file($_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;], &#39;/var/www/uploads/&#39;. basename($_FILES[&#39;userfile&#39;][&#39;name&#39;]));

는 전체 업로드 프로세스를 실현할 수 있습니다.

하지만 파일이 커질수록 양식 업로드의 단점이 드러납니다. 특히, 지나치게 큰 파일 업로드를 방지하기 위해 최소 파일 크기를 확보한다는 단순한 아이디어가 너무 어려워졌습니다. 하나씩 살펴보겠습니다.

MAX_FILE_SIZE 전달

MAX_FILE_SIZE 숨겨진 필드(바이트 단위)는 파일 입력 필드 앞에 배치되어야 하며 해당 값은 수신된 파일의 최대 크기입니다. . 이는 브라우저에 대한 권장사항이며, PHP도 이를 확인합니다. 이 설정은 브라우저 측에서 쉽게 무시할 수 있으므로 이 기능을 사용하여 대용량 파일을 차단할 것으로 기대하지 마십시오. 실제로 PHP 설정의 최대 업로드 파일 크기는 만료되지 않습니다. 하지만 이 항목을 양식에 추가하는 것이 더 좋습니다. 사용자가 대용량 파일이 업로드될 때까지 기다리다가 파일이 너무 커서 업로드가 실패했음을 발견하는 데 시간을 소비하는 문제를 피할 수 있기 때문입니다.

서버 측을 통해

MAX_FILE_SIZE가 유효하지 않기 때문에 사용자는 파일을 서버에 업로드할 수 있습니다. 서버 측에서는 $_FILES['userfile']['size']를 사용하여 크기를 결정합니다. 그런 다음 사용자가 업로드한 파일의 크기에 따라 업로드를 수락할지 여부를 결정하고 정보를 반환합니다. 서버에 대한 부하와 악의적인 방해 행위 가능성을 배제하면 이 솔루션은 대역폭 낭비에 지나지 않으며 사용자의 파일 업로드도 제한하는 것으로 보입니다.

그러나 이는 불가능합니다. PHP 파일 업로드는 php.ini의 다음 설정에 영향을 받습니다.

설정 방법은 매뉴얼에 자세히 설명되어 있으므로 이 방법을 사용하십시오. PHP 실행 스크립트가 memory_limit를 초과하면 모든 POST 데이터가 손실되고 오류가 보고되지 않기 때문에 여전히 실행 가능하지 않습니다!
post_max_size
upload_max_filesize
max_execution_time
memory_limit

사용자가 매우 긴 양식을 작성하여 메모리 제한을 초과하는 파일과 함께 업로드한다고 상상해 보세요. 오랜 대기 시간 후에 그는 자신이 기다리고 있는 것이 또 다른 깨끗한 빈 양식이라는 것을 알게 됩니다. 정말 인상적인 사용자 경험입니다. 게다가 수십 MB의 서버 트래픽은 파일 크기 감지에만 사용되는데, 이는 현재 네트워크 환경에서 허용되지 않습니다.

Javascript를 통해

Javascript는 불가능해 보이는 많은 작업을 수행할 수 있지만 브라우저가 할 수 없는 작업은 JS가 수행할 수 없습니다. 본질적인 단점으로 인해 이 작업은 Javascript만으로는 불가능합니다. 그러나 일부 IE 전용 방법은 참조용으로 여전히 존재합니다.

Flash를 통해

Flash의 FileReference 클래스는 비교적 포괄적인 파일 처리 방법 세트를 제공합니다. 이제 대부분의 대용량 파일 업로드에도 Flash 기반 솔루션이 사용됩니다. Flash를 사용하여 Js와 상호작용하는 경우 클라이언트가 파일 크기를 감지할 수 있습니까? 대답은 '예'입니다.

먼저 플래시 파일에서 FileReference 클래스를 인스턴스화합니다.

이 클래스를 기반으로 Flash에서 제공하는 파일 탐색 및 SelectFile 이벤트를 사용하여 브라우저 이벤트를 대체할 수 있습니다.
var fr = new FileReference();

1. SelectFile 바인딩

2. 플래시에서 얻은 파일 정보를 배치하기 위한 Js 액세스용 객체를 생성합니다.
fr.addEventListener(Event.SELECT, onSelectFile);

3. 생성 파일 탐색 메소드
var s = {
    size:0,
    name:&#39;&#39;,
    type:&#39;&#39;
}

4. SelectFile 이벤트가 트리거되면 파일 정보를 전달합니다
function browseFile():void {<br>
    fr.browse();<br>
}

5. Js가 호출할 수 있도록 browserFile 메소드를 공개합니다
function onSelectFile(e:Event):void {<br>
    s.size = fr.size;<br>
    s.name = fr.name;<br>
    s.type = fr.type;<br>
}

6. 획득한 파일 정보를 Js에 전달
ExternalInterface.addCallback("browseFile", browseFile);

이제 Js를 통해 플래시에서 전달된 파일 크기 정보를 얻을 수 있습니다.
ExternalInterface.call("onSelectFile",s);

결론

현재까지는 문제가 해결된 것 같습니다. 파일 크기 확인은 성공적으로 완료되었죠? 하지만 이 글의 최종 결론은 플래시 기반의 파일 크기 검증은 여전히 ​​가능하지 않다는 것입니다.

파일 크기 확인의 유일한 목적은 업로드입니다. 위의 데모에서는 성공적으로 검증된 파일 이름이 입력 상자에 표시되는 것을 볼 수 있습니다. 업로드에 익숙한 학생들은 뭔가 부족하다고 생각하지 않나요? 그렇죠, 플래시를 통해서만 파일명을 얻을 수 있지만, 파일의 전체 경로를 얻을 수는 없고, 파일 경로는 입력으로 업로드하기 위한 필수 조건입니다. 따라서 Flash와 JS 상호 작용을 통해 파일 크기를 성공적으로 확인할 수 있지만 나중에 업로드하려면 계속해서 Flash만 사용할 수 있습니다.

Flash 개발에서는 보안상의 이유로 파일의 전체 경로를 차단하는 것은 이해할 수 있습니다. 그러나 파일 업로드, 특히 PHP 환경의 파일 검증 업로드 솔루션은 여전히 ​​최적의 솔루션이 없습니다.

물론 이를 보완할 수 있는 방법은 여러 가지가 있습니다.

Perl 기반 프로젝트 FileChucker, PHP를 사용하여 서버에서 직접 멋진 소켓 링크를 만듭니다.

하지만 결국에는 HTML만을 기반으로 구현할 수 있는 엄격하고 강력한 업로드 솔루션을 볼 수 있는 날이 멀지 않았으면 좋겠습니다.

마지막으로 코드 다운로드입니다.

PHP 파일 업로드 크기 설정에 대한 자세한 설명

PHP로 파일을 업로드할 때 가장 흔히 발생하는 문제는 대용량 파일을 업로드할 때 발생하는 오류입니다. 여기에는 PHP 구성 파일인 php.ini가 포함됩니다.

이 구성 파일에는 파일 업로드와 밀접하게 관련된 여러 값이 있습니다.

file_uploads = on // 시스템이 작동하는지 여부 파일 업로드 지원 허용

upload_tmp_dir //Linux의 시스템 기본 경로인 임시 파일 저장 경로는 win32에서 지정해야 함

upload_max_filesize = 2m //최대 크기 파일 업로드 허용

post_max_size = 2m //포스트 방식으로 PHP로 보낼 때 PHP가 수용할 수 있는 최대 데이터 용량

업로드하는 파일의 크기가 8m 미만인 경우 (일반적으로) 위 설정을 수정하면 요청이 충족됩니다.

그러나 8m를 초과하는 경우 위의 값 외에도 다른 두 값에 특별한 주의를 기울여야 합니다.

max_execution_time = 30 //각 스크립트의 최대 시간은 (php업로드시 용량이 너무 커서 시간문제일뿐)

memory_limit = 8m //각 스크립트가 소모할 수 있는 최대 메모리

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

이를 통해 업로드되는 파일의 크기가 무한할 수 있음을 유추할 수 있습니다. 그러나 네트워크 상황 등도 고려하십시오.


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