Post

(PHP) File Upload

파일 업로드

PUT을 사용한 방식과 POST를 사용한 방식 두 가지가 있다. 파일 업로드와 관련된 php.ini 설정에 어긋나는 경우 $\_FILES가 아예 비어있을 수 있으니 주의.

  • file\_uploads = off
  • upload\_tmp\_dir
  • upload\_max\_filesize
  • POST\_MAX\_SIZE
  • memory\_limit
POST를 사용한 방식

==CLIENT==

1
2
3
4
5
6
<form enctype="multipart/form-data" action="\_\_URL\_\_" method="POST">
<input type="hidden" name="MAX\_FILE\_SIZE" value="30000" />
<input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>

==SERVER==

1
2
3
4
$\_FILES["userfile"]["name"]
...
if (move\_uploaded\_file($\_FILES['userfile']['tmp\_name'], $uploadfile)){ ...

반드시 <form enctype="multipart/form-data ... >"로 지정해야 한다. 클라이언트 단에서 MAX\_FILE\_SIZE(measured in bytes)를 설정할 수는 있는데, 서버에서도 따로 설정해주어야 한다. 이를 지정하려면 반드시 file input field보다 이전에 위치하도록 해야 한다. 업로드된 파일은 임시 파일로 서버측 처리가 끝나는 순간 삭제되기 때문에 받은 파일을 따로 저장해야 한다.

* move\_uploaded\_file()은 업로드된 파일에 대해서만 동작하므로 is\_uploaded\_file()을 따로 사용할 필요는 없다.

보안

#1 파일 이름 hash해서 저장하거나, DB에 저장하기.

업로드된 파일을 파일 이름 그대로 저장하지 말고, 다음과 같이 hash해서 저장한다.

1
2
hash(fname, salt) => 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8

또는 DB에 저장하는 방법도 있다.

#2 업로드 파일 확장자 필터링
#3 업로드 파일 파일타입 체크

파싱해보거나, 헤더 시그니처 등등을 체크.

This post is licensed under CC BY 4.0 by the author.