파일 다운로드시 보안적용

 

파일 다운로드시 보안적용하여 다운로드 하기입니다.

 

업로드시 파일명을 변경하여 임의의 파일로 저장하고 다운로드시에는 다시 업로드시 파일명으로 변경하여 다운로드 하게 됩니다.

다운로드 파일을 사용하기 위해서는 업로드시에 파일은 임의의 파일명으로 변경해서 저장하고, 실제 파일명과 함께 디비에 저장합니다. 그리고, 다운로드 할때는 실제파일명과 저장된 파일명을 함께 사용하여 다운로드 합니다.

 

다운로드 파일 링크주소는 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

쿠키 header 에러 없이 굽기 함수

 

cookie는 페이지의 맨처음에 와야 생성이 됩니다.

다른 html내용 아래에서는 cookie 생성시 header 에러가 납니다.

가끔 작업하다가 보면 부득이하게 cookie를 다른 내용 아래에서 생성해야 할경우가 있는데요.

 

아래 함수는 header 에러를 피하면서 cookie를 생성하는 함수입니다.

function bdz_setcookie($name, $value, $expire, $path='/')
{
if (headers_sent()) {
$cookie = $name.'='.urlencode($value).';';
if ($expire) $cookie .= ' expires='.gmdate('D, d M Y H:i:s', $expire).' GMT';
echo '<script language="javascript">document.cookie!="'.$cookie.'";</script>';
} else {
setcookie($name, $value, $expire, $path);
}

}

 

 

또 한가지 방법으로는 ajax로 cookie 생성하는 파일을 불러오는 방법이 있습니다.

'PHP프로그래밍' 카테고리의 다른 글

파일 다운로드시 보안적용  (0) 2012.05.04
내 마이피플 키값 알아내기  (0) 2012.05.03
마이피플로 메세지 보내기  (0) 2012.05.03
◀ PREV 1 NEXT ▶