?

단축키

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 코드 폰트를 자동 설치하는 코드 1 네모 2018.07.16 977
77 코드 파이썬을 이용한 텔레그램 새 글 알림 (허접합니다) 4 이니스프리 2017.11.19 2520
76 코드 파이선 셸에서 실행하면...? 3 제르엘 2018.07.22 546
75 코드 클라이언트단에서 이미지 리사이징 6 file 네모 2018.05.06 1155
74 코드 컴퓨터의 uuid 얻기 5 title: 황금 서버 (30일)humit 2018.01.28 1239
73 코드 잘못 쓰면 컴퓨터가 날아가는 코드 29 제르엘 2018.07.08 1022
72 자료 이게 팔릴까 - Xe/라이믹스 에러페이지 [2017-10-04] 3 file title: 열려라 맛스타의 자물쇠TVJ 2017.10.04 753
71 코드 유튜브에 약간의 기능을 추가 해주는 크롬 확장 프로그램. 11 file Hanam09 2018.01.26 1078
70 코드 엑셀파일 불러서 히스토그램 그려주는 함수 국내산라이츄 2017.08.03 881
69 코드 엑셀 읽어서 그래프 그려주는 함수 1 국내산라이츄 2017.08.03 1555
68 코드 아주 간단한 기초 C++ 6 제르엘 2018.04.21 570
67 자료 소셜XE / 기존 통합 로그인 스킨 V2.2 2 file NoYeah 2017.06.28 1072
66 코드 세린서버에서 시도중인 백업 스크립트 입니다. 4 NoYeah 2017.06.27 837
65 코드 새 글 자동 댓글 스크립트 (AutoHotkey) 9 이니스프리 2017.11.26 3565
64 코드 사이트 서버 이전 (또는 미러링 사이트 구축) 쉽게하는 스크립트 1 NoYeah 2018.01.14 1044
63 코드 브라우저 언어에 따라 다른 폴더를 사용하는 PHP 코드 4 file 네모 2017.10.10 880
62 코드 미완성 받아쓰기 (C) title: 대한민국 국기gimmepoint 2018.04.20 578
61 코드 매우 특이한 버그 9 title: 대한민국 국기gimmepoint 2018.06.05 729
60 자료 링크 파싱 애드온용 스킨 (트위터 스타일) 3 file SNAX 2017.10.03 583
59 코드 도박 중독자를 위한 광고 차단 규칙 file 제르엘 2020.08.21 440
Board Pagination Prev 1 2 3 4 Next
/ 4