1. 파일 업로드
클라이언트의 사용자가 파일을 업로드하려면 사용자 인터페이스에 양식을 제공하여 파일 업로드 요청을 제출해야합니다. 업로드 된 파일은 다른 게시물 데이터와 달리 특수 데이터이므로 양식에 대한 특수 인코딩을 설정해야합니다.
다음과 같이 코드를 복사하십시오. <form action = "upload.php"method = "post"enctype = "multipart/form-data"> </form>
위의 ENCTEPE 속성에 익숙하지 않을 수 있습니다. 종종 무시되기 때문입니다. 그러나 HTTP Post 요청에 일반 데이터와 파일 유사 데이터가 모두 포함 된 경우이 속성을 추가해야하므로 다양한 브라우저의 호환성을 향상시킬 수 있습니다.
다음으로 파일을 업로드하려면 양식에 필드를 추가해야합니다.
다음과 같이 코드를 복사하십시오. <input type = "file"name = "첨부 파일">
위의 파일 필드는 다양한 브라우저에서 다르게 행동 할 수 있습니다. 대부분의 브라우저의 경우 위의 필드는 브라우징 버튼이있는 텍스트 상자로 렌더링됩니다. 이러한 방식으로 사용자는 파일 경로를 텍스트 상자에 직접 입력하거나 브라우징 버튼을 통해 로컬 하드 디스크에서 업로드 할 파일을 선택할 수 있습니다. 그러나 Apple의 사파리에서는 탐색 만 사용할 수있는 것 같습니다. 물론,이 업로드 박스의 스타일을 사용자 정의하여 기본 스타일보다 우아하게 보이도록 할 수도 있습니다.
아래에서 파일 업로드를 처리하는 방법을 더 잘 설명하려면 완전한 예를 들어보십시오. 예를 들어, 다음 양식을 사용하면 사용자가 내 로컬 서버에 첨부 파일을 업로드 할 수 있습니다.
다음과 같이 코드를 복사하십시오. <p> 첨부 파일을 업로드하십시오 : </p>
<form action = "upload.php"method = "post"encType = "multipart/form-data">
<입력 유형 = "파일"이름 = "첨부 파일">
<input type = "제출"값 = "첨부 파일 업로드">
</form>
팁 : php.ini에서 upload_max_filesize를 통해 파일을 업로드 할 수있는 최대 값을 설정할 수 있습니다. 또한 업로드 할 수있는 최대 양식 데이터를 설정하는 데 사용할 수있는 Post_max_Size도 있습니다. 특정 의미는 양식의 다양한 데이터의 합이므로 업로드 된 파일의 최대 값도 제어 할 수 있습니다. 이 필드를 설정함으로써. 그러나 후자의 값은 전자의 값이 전자보다 커야한다는 점에 유의하십시오. 전자는 후자의 형태 데이터의 일부에 속하기 때문입니다.
그림 1. Firefox에 표시된 양식 업로드
이 양식이 제출되면 HTTP 요청은 upload.php로 전송됩니다. upload.php에서 사용할 특정 정보를 표시하기 위해 업로드에서 인쇄했습니다 .php :
코드 사본은 다음과 같습니다.
헤더 ( '내용-유형 : 텍스트/일반');
print_r ($ _ 파일);
실험을하겠습니다. 위의 형식을 통해 내 로컬 서버에 블로그 로고를 업로드하십시오.
다음과 같이 코드를 복사하십시오. 배열
(
[첨부 파일] => 배열
(
[이름] => boy.jpg
[유형] => 이미지/jpeg
[tmp_name] => d : /xampp/tmp/php1168.tmp
[오류] => 0
[size] => 11490
)
)
위는 파일이 업로드 된 후 글로벌 배열에서 현재 업로드 된 파일에 대한 모든 정보입니다. 그러나이 정보가 안전한지 확인할 수 있습니까? 이름이나 다른 정보가 변조 된 경우 어떻게해야합니까? 우리는 항상 고객의 정보에 대해주의를 기울여야합니다!
특정 HTTP 요청의 각 부분
파일 업로드를 더 잘 이해하려면 클라이언트가 보낸 HTTP 요청에 포함 된 특정 정보를 확인해야합니다. 이전에 업로드 한 첨부 파일은이 블로그의 로고였습니다. 그림이기 때문에 위의 실험을 수행하는 데 적합하지 않습니다. 따라서 다음 내용이 포함 된 Test.Text 텍스트 파일을 다시 업로드했습니다.
코드 사본은 다음과 같습니다.
360W
360days
웹 소년의 삶
좋아요. 이제이 텍스트 파일을 업로드하고 upload.php에서 출력합니다.
코드 사본은 다음과 같습니다.
정렬
(
[첨부 파일] => 배열
(
[이름] => test.txt
[type] => 텍스트/일반
[tmp_name] => d : /xampp/tmp/php51c0.tmp
[오류] => 0
[크기] => 40
)
)
관련 브라우저에서 보낸 HTTP 포스트 요청을 살펴 보겠습니다 (일부 선택적 헤더를 생략했습니다).
코드 사본은 다음과 같습니다.
post /upload.php http /1.1
호스트 : www.360weboy.me
참조 : http://www.360weboy.me/
멀티 파트/형태-데이터; --------------------------------------------------------- -----------------------------
컨텐츠 길이 : 234
---------------------------------------- 24464570528145
내용화 : 형태-데이터; "첨부 파일";
컨텐츠 유형 : 텍스트/일반
360Woboy
360days
웹 소년의 삶
---------------------------------- 24464570528145-
위의 요청 형식, 이름, 파일 이름 및 컨텐츠 유형에 여러 필드가 있습니다 Test.txt 및 업로드 된 파일 형식 텍스트/plain (텍스트 파일을 나타냄). 그런 다음 다음 줄은 업로드 된 파일의 특정 콘텐츠임을 알 수 있습니다.
2. 안전 강화
파일 업로드의 보안을 향상 시키려면 $ _files Global Array에서 TMP_NAME 및 SIZE를 확인해야합니다. tmp_name에 의해 가리키는 파일이 실제로 /etc /passwd와 같은 것을 가리키기보다는 클라이언트의 사용자가 업로드 한 파일인지 확인하기 위해 PHP에서 is_uploaded_file () 함수를 사용하여 다음 판단을 내릴 수 있습니다. :
코드 사본은 다음과 같습니다.
$ filename = $ _files [ '첨부 파일'] [ 'tmp_name'];
if (is_uploaded_file ($ filename)) {
/ *는 업로드 된 파일입니다.
}
경우에 따라 사용자가 파일을 업로드 한 후 성공적으로 업로드 된 파일의 내용이 사용자에게 표시 될 수 있으므로 위 코드의 확인이 특히 중요합니다.
확인해야 할 또 다른 사항은 업로드 파일의 마임 유형입니다. 위의 업로드에서 출력 배열의 유형 필드입니다. 첫 번째 예제에서 업로드 한 것은 이미지이므로 $ _files [ 'attachment'] [ 'type']의 값은 'image/jpeg'입니다. 이미지/png, 이미지/jpeg, image/gif, image/x-png 및 server 쪽의 이미지/p-jpeg와 같은 Mime 유형 이미지 만 허용하려는 경우 다음과 유사한 코드를 사용하여 확인할 수 있습니다. (그냥 살펴보십시오) 오류와 같은 특정 코드는 시스템의 메커니즘을 따라야합니다) : :
코드 사본은 다음과 같습니다.
$ allow_mimes = 배열 (
'이미지/png',
'이미지/x-png',
'이미지/gif',
'이미지/jpeg',
'이미지/pjpeg'
);
$ image = $ _files [ '첨부 파일'];
if (! in_array ($ image [ 'type'], $ allow_mimes)) {
다이 ( '죄송합니다. 업로드 한 파일 형식은 정확하지 않으며 이미지 파일 만 허용합니다.');
}
// 업로드 된 이미지 파일을 계속 처리합니다
보시다시피, 파일의 마임 유형이 서버 측 요구 사항을 충족하도록합니다. 그러나 악의적 인 사용자 가이 MIME 유형에 의해 위장되는 척 할 수 있기 때문에 악의적 인 사용자가 다른 유해한 파일을 업로드하는 것을 방지하는 것만으로는 충분하지 않습니다. 예를 들어, 사용자는 JPG 사진을 만들고 사진의 메타 데이터에 악의적 인 PHP 코드를 작성하여 PHP라는 접미사가있는 파일로 저장했습니다. 이 악성 파일이 업로드되면 사진으로 간주되는 MIME 유형의 서버 측에서 성공적으로 확인하며 내부의 위험한 PHP 코드가 실행됩니다. 특정 그림의 메타 데이터는 다음과 유사합니다.
코드 사본은 다음과 같습니다.
파일 이름 : image.jpg
파일 크기 : 182007 바이트
파일 날짜 : 2012 : 11 : 27 7:45:10
해결 : 1197 x 478
댓글 : passthru ($ _ post [ 'cmd']);
PHP 코드가 이미지 메타 데이터의 주석 필드에 추가 된 것을 알 수 있습니다. 따라서 유사한 위험한 상황을 방지하기 위해 업로드 된 파일의 확장에 대한 필요한 점검도 수행해야한다는 것이 명백합니다. 다음 코드는 MIME 유형을 확인하기위한 이전 코드를 향상시킵니다.
코드 사본은 다음과 같습니다.
$ allow_mimes = 배열 (
'이미지/png'=> '.png',
'image/x-png'=> '.png',
'image/gif'=> '.gif',
'image/jpeg'=> '.jpg',
'이미지/pjpeg'=> '.jpg'
);
$ image = $ _files [ '첨부 파일'];
if (! array_key_exists ($ image [ 'type'], $ allow_mimes)) {
다이 ( '죄송합니다. 업로드 한 파일 형식은 정확하지 않으며 이미지 파일 만 허용합니다.');
}
// 접미사 이름이 생략 된 파일 이름을 가져옵니다.
$ filename = substr ($ image [ 'name'], 0, strpos ($ im
// 접미사 이름을 추가합니다
$ filename. = $ allow_mimes [$ image [ 'type']];
// 업로드 된 파일을 계속 처리합니다
위의 코드를 통해 업로드 된 이미지 Metafile에 PHP 코드가 포함되어 있더라도 이미지 파일의 이름이 접미사 이름과 이미지 형식의 파일로 이름이 바뀌므로 PHP 코드가 실행되지 않습니다. 위의 코드는 정상 업로드 된 이미지에 부정적인 영향을 미치지 않습니다.
위의 여러 단계를 수행하기 위해 보안 점검을 개선 한 후 업로드 된 파일을 지정된 디렉토리에 저장하려면 기본 기능 Move_Uploaded_File을 사용하여 구현할 수 있습니다.
코드 사본은 다음과 같습니다.
$ tmp_filename = $ _files [ '첨부 파일'] [ 'tmp_name'];
$ filename = '/path/to/attachment.txt';
if (move_uploaded_file (tmp_filename, $ filename)) {
/ * $ temp_fileName 임시 디렉토리에 저장된 업로드 파일을 다음에 해당 디렉토리에 첨부 파일에 성공적으로 저장합니다.
}
업로드 된 파일의 크기를 제한해야 할 수도 있으므로 파일 크기 기능을 사용하여 업로드 된 파일의 크기를 얻고 판단을 내릴 수 있습니다.
좋아, 파일 업로드에 대해 지금 써합시다. 이 입문 기사가 도움이되기를 바랍니다.