?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
라이선스 기타(따로 작성)

안녕하세요?


오늘 SIR에 올라온 Q&A 글 중에서 마침 제가 예전에 작성해놓은 스크립트를 조금 수정하면 처리 가능한 질문이 있더군요.


쟁쟁하신 다른 회원님들에 비해 제가 실력은 많이 부족하지만 운좋게 답변 채택을 받았습니다 :)


1) 원본 이미지는 그대로 두고, 2) 원본 파일의 비율은 유지하되, 


이미지를 원하는 크기로 축소/확대한 RAW 데이터를 리턴하여 출력하는 스크립트입니다.


방금 살짝 수정을 했지만 여전히 스크립트가 여러모로 지저분하고 군더더기가 많네요 ㅠㅠ


그래도 PNG와 JPG 파일을 테스트해봤는데 잘 리사이즈되니 다행이에요~!


<?php
function resize_image($file, $dst_w, $dst_h, $crop=FALSE) {
    list($width, $height) = getimagesize($file);
    $ratio = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*abs($ratio-$dst_w/$dst_h)));
        } else {
            $height = ceil($height-($height*abs($ratio-$dst_w/$dst_h)));
        }
        $newwidth = $dst_w;
        $newheight = $dst_h;
    } else {
        if ($dst_w/$dst_h > $ratio) {
            $newwidth = $dst_h*$ratio;
            $newheight = $dst_h;
        } else {
            $newheight = $dst_w/$ratio;
            $newwidth = $dst_w;
        }
    }
   
    $exploding = explode(".",$file);
    $ext = end($exploding);
    switch($ext){
        case "png":
            $src = imagecreatefrompng($file);
        break;
        case "jpeg":
        case "jpg":
            $src = imagecreatefromjpeg($file);
        break;
        case "gif":
            $src = imagecreatefromgif($file);
        break;
        default:
            $src = imagecreatefromjpeg($file);
        break;
    }
   
    $result = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($result, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    return array($result, $ext);
}
$img = resize_image('PATH', WIDTH, HEIGHT); // 파일경로, 폭, 높이를 입력하세요
ob_start();
switch($img[1]){
    case "png":
        imagepng($img[0]);
    break;
    case "jpeg":
    case "jpg":
        imagejpeg($img[0]);
    break;
    case "gif":
        imagegif($img[0]);
    break;
    default:
        imagejpeg($img[0]);
    break;
}
$output = base64_encode(ob_get_contents());
ob_end_clean();
?>
<img src="data:image/<?php echo $img[1]; ?>;base64,<?php echo $output; ?>"/>


이미지 처리 과정에서 서버의 리소스를 적지 않게 사용하겠지만, 이미지를 적절히 축소하면 트래픽 절감의 효과는 있겠네요 ^^


스크립트에서 사용된 함수는 아래 URL의 스크립트를 참조하였습니다.

https://ourcodeworld.com/articles/read/197/how-to-resize-an-image-and-reduce-quality-in-php-without-imagick


그럼 즐겁고 뜻깊은 연말 되세요 ^^


여러모로 부족한 스크립트를 읽어주셔서 감사합니다~!

  • profile
    title: 황금 서버 (30일)humit 2018.12.29 11:40
    몇 가지 추가하자면 base64로 출력하는 경우 html의 캐싱을 허용해놓지 않으면 캐싱으로 인한 효과를 볼 수 없다는 단점이 있습니다.
    그래서 base64로 출력하기보다는 리사이즈한 이미지를 따로 파일로 저장해서 뿌려주는 것이 좋을 수도 있습니다.
    이렇게 하면 여러 번을 불러오더라도 캐싱이 되어 있으므로 서버에 무리가 가지 않는다는 장점이 있습니다.
  • profile
    이니스프리 2018.12.29 11:59
    제가 미처 캐싱까지 생각하지 못했군요 ㅠㅠ
    말씀해주셔서 감사합니다~!
    실사용할 때에는 리사이즈한 이미지를 다시 파일로 저장하도록 해야겠네요.
    이제 36시간 정도 남으신 것 같은데 전역을 미리 축하드립니다 :)
    날씨가 추운데 humit 님께서도 감기 조심하세요!
  • profile
    title: 황금 서버 (30일)humit 2018.12.29 12:11
    전역 축하 감사합니다 ㅎㅎ
  • profile
    title: 황금 서버 (30일)humit 2018.12.29 11:58

    그리고 만약 resize_image 함수의 인자를 사용자에 의해서 받을 수 있다면 XSS 공격도 가능합니다.

    한 예로 $file의 인자로 "><script>alert('XSS')</script>/img 를 주게 되면 $ext 부분이 "><script>alert('XSS')</script>/img 로 들어가기 때문에 XSS가 성공할 수 있게 됩니다.

    따라서 switch($ext) case default 부분에서 $ext = "jpeg"로 주는 것이 필요합니다. 

  • profile
    이니스프리 2018.12.29 12:04
    허걱 ㅠㅠ 이건 제가 전혀 생각하지 못했던 부분이네요~!
    그런 방식으로 XSS가 가능하군요 ㄷㄷ
    그 부분은 반드시 반영을 해야겠네요!!
    보안의 세계는 참 어렵네요 ㅠㅠ
    부대에서 드시는 식사가 연말이라고 맛있을 것 같지는 않지만 점심식사 맛있게 드세요~ ^^
  • profile
    title: 황금 서버 (30일)humit 2018.12.29 12:12
    아무래도 창과 방패의 싸움에서 창이 유리할 수밖에 없는 것 같더군요...
    방패는 모든 부분을 방어해야 하지만 창은 한 쪽만 공략하면 되니까요 ㅋㅋㅋ

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
78 자료 AdBlock 접근 방지 애드온 v0.1 3 file 네모 2017.10.05 745
77 자료 AdminLTE용 에디터 스타일 4 file title: 은메달도다 2017.07.07 837
76 코드 AWSCLI, in a single file (portable, linux) 1 file Seia 2021.04.10 312
75 코드 c 이진트리 전,중,후위 알고리즘 2 title: 대한민국 국기gimmepoint 2018.04.24 644
74 코드 Cmd 에서 서비스 시작 / 종료하기 1 ProjectSE 2018.02.18 698
73 코드 CMD로 로컬 연결 고정 IP 설정하기 1 title: 황금 서버 (30일)humit 2018.02.06 1092
72 코드 C언어 삼중자를 이용한 코드 title: 황금 서버 (30일)humit 2018.07.22 484
71 자료 even_move - 감성적인 에러 페이지 7 file title: 열려라 맛스타의 자물쇠TVJ 2017.08.08 897
70 자료 Gentelella 3 file NoYeah 2017.06.29 1061
69 자료 Gentelella 레이아웃에 사용가능한 가격 테이블 위젯입니다. 3 file NoYeah 2017.07.03 694
68 코드 Git 저장소에서 자동으로 받아 업데이트하는 쉘 스크립트 5 NoYeah 2017.09.16 769
67 코드 Hello, World!를 출력해보자 18 네모 2018.04.21 661
66 코드 HEX를 RGB로, RGB를 HEX로 바꾸는 PHP 코드 1 네모 2018.05.05 678
65 코드 html 초보가 만든 자소서 4 title: 대한민국 국기gimmepoint 2018.04.21 740
64 코드 JavaScript에서 파이썬 문자열 처리 함수 중 하나 (바인딩)를 구현 7 Seia 2020.01.20 564
63 코드 Koa에서 자동으로 라우팅 채워주기 Seia 2020.01.22 662
62 자료 RBGE - 이쁘고 깔끔한 에러페이지 4 file title: 열려라 맛스타의 자물쇠TVJ 2017.08.08 771
61 자료 [1.8a] Bootstrap 'Panel' 위젯 스타일 1 file title: 은메달도다 2017.08.09 678
60 자료 [Autohotkey] 매분 정각에 전체화면을 캡쳐하는 스크립트 4 file 이니스프리 2020.05.22 1242
59 자료 [Bootstrap] xeACE 레이아웃 3 title: 은메달도다 2017.09.17 727
Board Pagination Prev 1 2 3 4 Next
/ 4