이곳에 올려진 파일업로드와 관련되어 나온 보안 해결책에 대해 정리해 봤습니다.

첫째,
PHP 파일업로드 후 스크립트 실행에 대한 해결책..

$UPfile = "$upload_name.zip"; // 업로드된 원래 파일뒤에 .zip 포함
$F = opendir("./data") or die(error("./data 디렉토리를 열수 없습니다"));



while($existF = readdir($F)) {

if (file_exists("./data/$UPfile")) {
$y++;
$UPfile = "$upload_name@$y.zip";
// 같은이름이 존재하면 @번호 형식으로 파일명 변경
}

}

closedir($F);

$tfile = substr($UPfile,0,-4); // .zip을 뺀 파일명 DB에 저장

copy($upload,"./data/$UPfile") or die(error("파일 저장에 오류가 있습니다"));

실제로 저장되어 있는 파일명은 .zip 으로 되어있어서 실행이 불가능하며
무조건적으로 다운됩니다.

다운로드시 Header 함수 사용

$filename = "./data/$file.zip"; // 저장되어 있는 파일명
$filesize = filesize($filename); // 저장되어 있는 파일의크기
$Tfile = explode("@",$file); // 원래 파일명 반환
Header("Content-Type: application/zip");
Header("Content-Disposition: inline; filename=$Tfile[0]");
Header("Content-Length: $filesize");
Header("Pragma: no-cache");
Header("Expires: 0");
$fp=fopen("$filename", "r");
echo fread($fp, $filesize);
fclose($fp);

둘째,
GET 방식으로 변수전달하여 서버내의 파일을 다운로드 하는 문제와
사용자가 파일전송폼의 HTML 문서를 사용자의 PC에 저장하여
POST 방식으로 변수전달할경우

if (!eregi("http://$HTTP_HOST",$HTTP_REFERER) or $QUERY_STRING) {
echo("정상적인 접근 바랍니다");
exit;
}
2011/10/24 12:17 2011/10/24 12:17

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다