Webi Blog

웹아이에서 운영되고 있는 블로그입니다.

Web/PHP

[PHP] 원격지 파일 주소 노출 안하고 curl로 다운로드 받기

웹아이 2021. 9. 3. 19:14

파일 다운로드를 구현할 때 아주 간단하게 a태그를 이용해서 구현을 합니다.

하지만 그렇게 할 경우 파일 경로가 아주 쉽게 노출이 되어버립니다.

 

보통 노출되어도 크게 상관없는 경우가 많지만

유료 클래스 상품을 구매한다거나 온라인 컨텐츠를 유료로 판매할 경우에는 파일의 경로가 노출되면

쉽게 공유가 되어버리기 때문에 노출을 막습니다.

 

물론 스토리지나 CDN 서비스 자체에서 경로를 알더라도 권한을 막아 불가하게 설정할 수 있지만

단순 웹호스팅을 이용하거나 보안 설정이 불가피 할 때 PHP에서 파일 경로를 노출하지 않고 원격지 파일을 다운로드를 받을 수 있는 방법을 포스팅 합니다.

 

 

// 파일을 받을 권한이 있는 지 체크
if($is_guest)
    alert('다운로드 권한이 없습니다.');


$filepath = "http://webi.kr/abc.zip"; // 다운로드 받을 파일 주소
$filename = end(explode("/", $filepath)); // 파일 주소에서 파일명만 추출


// 브라우저별 헤더 설정 ( 그누보드 소스 )
if(preg_match("/msie/i", $_SERVER['HTTP_USER_AGENT']) && preg_match("/5\.5/", $_SERVER['HTTP_USER_AGENT'])) {
    header("content-type: doesn/matter");
    header("content-length: ".filesize($filepath));
    header("content-disposition: attachment; filename=\"$filename\"");
    header("content-transfer-encoding: binary");
} else if (preg_match("/Firefox/i", $_SERVER['HTTP_USER_AGENT'])){
    header("content-type: file/unknown");
    header("content-length: ".filesize($filepath));
    header("content-disposition: attachment; filename=\"".basename($filename)."\"");
    header("content-description: php generated data");
} else {
    header("content-type: file/unknown");
    header("content-length: ".filesize($filepath));
    header("content-disposition: attachment; filename=\"$filename\"");
    header("content-description: php generated data");
}
header("pragma: no-cache");
header("expires: 0");


// curl을 이용해 파일 다운로드
$ch = curl_init();

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $filepath);

$file = curl_exec ($ch);
curl_close($ch);

 

위의 코드를 별도의 파일을 만들어서 다운로드 시킬 경우 권한 체크도 함께 진행할 수 있고, 파일 다운로드의 로그도 남길 수 있어 유용합니다.

그누보드의 bbs/download.php 는 로컬파일을 다운로드 받을 수 있게 되어있지만 원격지 파일은 다운로드가 안되는 문제가 있어 일부 코드를 수정하여 Curl로 원격지 파일을 다운로드 받을 수 있도록 하였습니다.

 

반응형