1.방문자가 사이트에 접속
2.현재의 시간과 방문자의 ip체크
  각 파일들의 생성시간과 현재 시간과의 차가 20초 이상인 파일을 삭제
3.ip를 이름으로 갖는 텍스트 파일을 생성(now라는 하위 디렉토리를 미리 만들어준다)
4.파일의 개수를 세어 출력

<?
$time = time(); //현재 시간저장
$ip =$REMOTE_ADDR; //방문자의 IP저장

$result =opendir("now"); //now에 있는 파일이름 꺼내기
while ($file =readdir ($result)) {
 if ($file == "." || $file == "..") {continue;} //파일이름이 . 또는 .. 일 경우 무시하고 넘어가기
 $visit = filemtime ("now/$file"); //파일의 생성시간 구하기
 $out = $time - $visit; //방문자의 접속시간
 if ($out >20) {unlink ("now/$file");} //접속 유지시간이 지난 사용자 삭제
}
$fp=fopen ("now/$ip", "w"); //파일 쓰기모드로 열기
fwrite($fp, "0"); //파일생성, 그 내용은 0
fclose($fp); //파일포인터 닫기


$result =opendir("now"); //now에 있는 파일이름 꺼내기
while ($file =readdir ($result)) {
 if ($file == "." || $file == "..") {continue;} //파일이름이 . 또는 .. 일 경우 무시하고 넘어가기
 $i++; //현재 접속자의 수 증가
}

echo "현재 $i 명의 접속자가 있습니다";
?>




파일업로드하기
php.ini파일에서 파일업로드가 가능하게끔
설정을 변경해 주어야 한다

file_uploads = On

upload_tmp_dir = "d:/temp"

upload_max_filesize = 2M

이렇게 설정해 준다음 서버를 중지한다음 재시작해 준다.

업로드 폼파일을 upload.php 라 하고
폼이 전송되는 파일을 uploading.php 라 해 준다음
upload.php파일을 만들자

upload.php
<form method="post" action="uploading.php" enctype="multipart/form-data">
<input type="file" name="data" size="20">
<br><input type=submit value="파일업로드하기">
</form>
여기서 file로 전송된 변수 $data는 다른 부수적 변수를 만들어 낸다
$data - 업로드된 파일 그 자체
$data_name - 업로드된 파일의 이름
$data_size - 업로드된 파일의 크기
$data_type - 업로드된 파일의 MIME TYPE

업로드된파일은 우리가 지정해준 upload_tmp_dir 에 임시 저장되는데,
이 파일을 우리가 넣어주려는 file이라는 디렉토리로 옮겨 주어야만 한다
이때 사용하는 함수가
move_uploaded_file 이다
move_uploaded_file ("원본파일", "사본파일");


uploading.php
<?
move_uploaded_file($data, "file/$data_name");
echo "
이름: $data_name <br>
크기: $data_size <br>
종류: $data_type <br>";
?>


보안에 관해 생각해 볼점
위의 예제처럼 하면 보안에 심각한 문제가 생기는데 이를 해결하기 위한 방법으로

1.파일이 업로드 될때 임의의 확장자로 파일의 확장자를 변경하여
웹에서 실행되지 않도록 하는 방법

2. php나 html과 같은 확장자의 업로드를 미리 제한하여 애초에 업로드가 이루어 지지 않게 하도록 하는 방법

첫번째 방법이라면 move_uploaded_file함수의 두번째 매개변수에서
사본의 파일의 이름뒤에 .file 과 같은 확장자를 뒤에 붙여 웹에서 실행되지 않게 하면된다.
하지만 이 방법은 다시 파일을 웹상에서 꺼내올때 붙였던 확장자를 제거하는 번거로움이 따른다.

두번째 방법은 파일이 업로드 되었을때 확장자를 확인하여 php나 html과 같은 확장자일 경우 업로드 하지 않도록 하는 거이다. 정규표현식으로 구현할 수 있다.
uploading.php
<?
if (eregi("\.php$|\.html$", $data_name)) {echo "업로드 불능파일입니다"; exit;}
move_uploaded_file($data, "file/$data_name");
echo "
이름: $data_name <br>
크기: $data_size <br>
종류: $data_type <br>";
?>


첨부파일이름중복에 관한 문제
같은 이름의 파일을 두번 올렸을때 기존파일은 삭제되고 새로운 파일만 남게될 수 있는데
이를 해결하기 위해서는

1. 새로운 파일뒤에 적절한 구분자를 붙여 새로운 이름의 파일로 바꾸어 주는 것
2. 각 파일을 유일한 이름의 디렉토리 안에 구분하여 집어넣는것

두번째 방법은 유일한 디렉토리를 만드는 것이 이슈인데 이때 가장 간단한 바업은
시간함수를 적절히 사용하는 것이다.
유닉스타임스탬프값과 마이크로 타임을 적절히 섞어서 디렉토리의 이름으로 사용한다면
디렉토리의 이름이 겹칠확률은 0%에 가깝다고 봐도 된다
<?
echo time()."@".(double)microtime();
?>
결과는 1232470685@0.343753

uploading.php
<?
if (eregi("\.php$|\.html$", $data_name)) {echo "업로드 불능파일입니다"; exit;}

$dir=time()."@".(double)microtime(); //디렉토리 이름 구하기
mkdir("file/$dir", 0777); //디렉토리 생성

move_uploaded_file($data, "file/$dir/$data_name");

echo "
이름: $data_name <br>
크기: $data_size <br>
종류: $data_type <br>";
?>
이 방법은 파일이름 중복을 막는 것 이외에도
보안적인 측면에서 업로드된파일의 무단링크를 어느 정도 막아주는 역할을한다

+ Recent posts