파일 다운로드시 보안적용
파일 다운로드시 보안적용하여 다운로드 하기입니다.
업로드시 파일명을 변경하여 임의의 파일로 저장하고 다운로드시에는 다시 업로드시 파일명으로 변경하여 다운로드 하게 됩니다.
다운로드 파일을 사용하기 위해서는 업로드시에 파일은 임의의 파일명으로 변경해서 저장하고, 실제 파일명과 함께 디비에 저장합니다. 그리고, 다운로드 할때는 실제파일명과 저장된 파일명을 함께 사용하여 다운로드 합니다.
다운로드 파일 링크주소는 http://도메인/lownload.php?tmp_name=저장된파일명&name=실제파일명 가 됩니다.
download.php 파일은 아래와 같습니다.
<?
ini_set('memory_limit', '5120M'); // 큰용량 파일 다운로드시 적용
set_time_limit ( 0 );
$_file_dir="파일저장된 곳 경로"; // 경로끝에 / 붙여주세요.
// 파일명 보안 조치
function basename_fix($filename)
{
return preg_replace('/^.+[\\\\\\/]/', '', $filename);
} // function()
$_GET['tmp_name'] = basename_fix(stripslashes($_GET['tmp_name'])); // 실제저장된 파일명
$_GET['name'] = basename_fix(stripslashes($_GET['name'])); // 업로드시 파일명
// 파일 존재여부, 읽기 가능한지 검사
$file = $_file_dir.DIRECTORY_SEPARATOR.$_GET['tmp_name'];
if (!file_exists($file))
{
?>
<script type="text/javascript">
<!--
alert("서버에 파일이 존재하지 않습니다.");
//-->
</script>
<?
} else if (!is_readable($file))
{
?>
<script type="text/javascript">
<!--
alert("서버에서 파일의 읽기권한이 없습니다.");
//-->
</script>
<?
} else
{
$file_size = filesize($file);
$fp = fopen($file,"r");
$contents = fread($fp,$file_size);
fclose($fp);
if (!function_exists('mime_content_type_simple')) {
function mime_content_type_simple($filename) {
$idx = strtolower(end( explode( '.', $filename )) );
$mimet = array(
'ai' =>'application/postscript',
'aif' =>'audio/x-aiff',
'aifc' =>'audio/x-aiff',
'xyz' =>'chemical/x-xyz',
'zip' =>'application/zip',
'xls' =>'application/vnd.ms-excel',
'ppt' =>'application/mspowerpoint',
'doc' =>'application/msword',
'htm' =>'text/html',
'html' =>'text/html',
'eml' =>'message/rfc822',
'txt' =>'text/plain',
'pdf' =>'application/pdf',
'jpg' =>'image/jpeg',
'gif' =>'image/gif',
'png' =>'image/png',
'dwg' =>'application/acad',
'dxf' =>'application/dxf'
);
if (isset( $mimet[$idx] )) {
return $mimet[$idx];
} else {
return 'application/octet-stream';
}
}
}
$c_type = mime_content_type_simple($_GET['name']);
if (strstr($_SERVER['HTTP_USER_AGENT'],"MSIE") && strtolower($__NFUpload['charset']) == 'utf-8')
{
$_GET['name'] = iconv('utf-8//IGNORE', 'cp949', $_GET['name']);
} else if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false)
{
$_GET['name'] = str_replace(";", "%3B", $_GET['name']);
} // if()
$mtime = filemtime($file);
if (!$mtime)
$mtime = time();
header('Last-Modified: '.date('r', $mtime));
if ( strstr($_SERVER['HTTP_USER_AGENT'],"MSIE 5.5"))
{
header("Content-Type: doesn/matter\r\n");
header("Content-Disposition: filename=\"".$_GET['name']."\"\r\n\r\n");
header("Content-Length: ".$file_size."\r\n");
header("Content-Transfer-Encoding: binary\r\n");
}else
{
header("Content-Type: $c_type\r\n");
header("Content-Disposition: attachment; filename=\"".$_GET['name']."\"\r\n\r\n");
header("Content-Length: ".$file_size."\r\n");
header("Content-Transfer-Encoding: binary\r\n");
} // if()
echo $contents;
} // if()
?>
'PHP프로그래밍' 카테고리의 다른 글
내 마이피플 키값 알아내기 (0) | 2012.05.03 |
---|---|
마이피플로 메세지 보내기 (0) | 2012.05.03 |
쿠키 header 에러 없이 굽기 함수 (0) | 2012.05.03 |