엄범


파일 업로드

`` PUT``을 사용한 방식과 `` POST``를 사용한 방식 두 가지가 있다.

파일 업로드와 관련된 php.ini 설정에 어긋나는 경우 ``php $_FILES``가 아예 비어있을 수 있으니 주의.

  • ``file_uploads = off``
  • ``upload_tmp_dir``
  • ``upload_max_filesize``
  • ``POST_MAX_SIZE``
  • ``memory_limit``


POST를 사용한 방식

==CLIENT==

```html

<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==

```php

$_FILES["userfile"]["name"]

...

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)){ ...

```

반드시 ``html <form enctype="multipart/form-data ...  >"``로 지정해야 한다.

클라이언트 단에서 ``MAX_FILE_SIZE``(measured in bytes)를 설정할 수는 있는데, 서버에서도 따로 설정해주어야 한다. 

이를 지정하려면 반드시 file input field보다 이전에 위치하도록 해야 한다.

업로드된 파일은 임시 파일로 서버측 처리가 끝나는 순간 삭제되기 때문에 받은 파일을 따로 저장해야 한다.


* ``php move_uploaded_file()``은 업로드된 파일에 대해서만 동작하므로 ``php is_uploaded_file()``을 따로 사용할 필요는 없다.


보안

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

업로드된 파일을 파일 이름 그대로 저장하지 말고, 다음과 같이 hash해서 저장한다.
```php
hash(fname, salt) => 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
```
또는 DB에 저장하는 방법도 있다.

#2 업로드 파일 확장자 필터링


#3 업로드 파일 파일타입 체크

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






'Languages & Frameworks > PHP' 카테고리의 다른 글

[PHP] HTML tag escape  (0) 2017.11.11
[PHP] File Upload  (0) 2017.11.11
[PHP] File IO  (0) 2017.11.11
[PHP] SQL Escape & Bypass  (0) 2017.10.23
[PHP] mysqli, PDO / password_*  (0) 2017.06.24
[PHP] 함수, 클래스, 객체, 상속, 트레이트  (0) 2017.06.10