PHP 파일 업로드 보안
출처: zetyx.com
파일 업로드를 할경우 php 관련 파일들은 서버에서 실행이 될 위험이 있습니다.. 그래서 저같은 경우는 업로드 할 경우 tmp 안에 존재하는 파일을 제가 원하는 위치로 복사를 한후 삭제 합니다.. 복사할때 파일명을 변환하는데.. 우선 확장자는 있어야 합니다.. 왜 그런지는 모르겠지만 확장자가 없을경우 php파일은 그냥 읽히더군요...(저만 그런가요..?) 그래서 서버에서 인식할 수 없는 확장자명으로 바꿉니다.. 저는 down 이라고 써요.. 그리고 파일명이 겹칠 수도 있겠죠..?? 파일명을 현재시간으로 바꿉니다.. 그러니까 결국 파일명은 200001010345.down 이런식이 되겠죠..??^^ 그리고 원래 파일명은 따로 저장합니다.. 그리고 파일 다운로드를 시킬때는 header 함수를 이용해서 보냅니다.. 그럼 원래 파일명으로 변환하는게 가능하지요.. 아래 소스 참고하세요..
<?php include "dbconn.php3"; mysql_query("update $table_name set downnum=downnum+1 where no=$no;",$connect); // 다운로드 횟수 증가. $down = mysql_fetch_array(mysql_query("select * from $table_name where no=$no;",$connect)); // 데이타를 가져옴. $file_dir = "files"; //파일이 저장되어 있는 디렉토리. $fp = fread(fopen("$file_dir/$down[filename]","r"),$down[filesize]); // 서버상에 존재하는 파일을 엽니다.
// 아래부터는 HTTP header를 작성하는 부분입니다. Header에는 파일의 타입과 이름, 그리고 파일 크기가 포함됩니다. header("Content-type:file/unknown"); //파일 타입이 file/unknown 일경우 무조건 다운로드 header("Content-length:$down[filesize]"); //파일의 크기 header("Content-Disposition:inline; filename=$down[realname]"); //파일 이름에 원래 realname 을 적어주면 다운로드시 그 이름으로 다운 echo($fp); //파일의 실제 내용을 전송합니다. ?> ======================================================== 한가지 문제가 있군요..
시간으로 할경우 동시에 2명이 접속해서 쓴다면.. 하나의 파일은 사라져 버리지 않을까요 ?
이걸 조금더 보안하자면 시간_접소자ip.down 이런게 좋지 않을지.. | |
|
|