<img> 태그를 이용하여 이미지를 표시하는 방법은 대개 src 속성을 이용하여 이미지 링크를 입력하는 방법을 사용한다.


하지만,

뭐 이런저런 이유로 인해서 referer를 체크하여 403 에러를 뱉어내는 사이트의 이미지를 가져와서 보여줘야 할 경우,

링크는 어떻게 긁어왔지만 그걸 <img src=""> 에 넣으면 이미지가 뜨지 않는다.



이럴 경우 PHP를 이용하여 REFERER를 속여서 이미지 데이터만을 가져온 다음,

해당 이미지를 데이터를 <img src="" 의 data, base64를 이용하여 표시할 수 있다.



<?PHP

// 이미지 데이터를 가져와서 base64 인코딩으로 변환 후 반환

function getImageData($imgLink)

{

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $imgLink);

// referer는 적당히 연구해서 속일 것. 비워도 되는 경우도 있음.

curl_setopt($curl, CURLOPT_REFERER, ''); 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$img = curl_exec($curl);

curl_close($curl);

return base64_encode($img);    

}


// 이미지 링크에서 이미지의 확장자를 읽어  mime type 형태로 반환

function getHeader($img)

{

    $extArr = array(

        'jpg' => 'image/jpg',

        'gif' => 'image/gif',

        'bmp' => 'image/bmp',

        'png' => 'image/png'

    );


    $ext = strtolower(substr($img, strrpos($img, '.')+1));

    return $extArr[$ext];

}


// 이미지 링크가 http://example.com/img1.jpg 일 경우를 가정

$img = 'http://example.com/img1.jpg';


// base64 데이터 가져오기

$imgBase64 = getImageData($img);

// mime type 가져오기

$imgData     = getHeader($img);


// 이미지 출력

echo '<img src="data:'.$imgData.';base64,'.$imgBase64.'" />';





막혔을 경우 우회하는 방식에 대한 실험적인 코드이므로 실제로 사용하기엔 설득력이 떨어짐. 

트래픽도 오롯이 전부 떠 안아야 하고...

서버의 디스크에 이미지 파일을 저장해서 캐시로 사용하는 식으로 개선할 수는 있겠지만.

그냥 개인용으로 사용하기 위해 삽질하다가 나온 코드.








Posted by bloodguy
,