[CKEditor 4] Base64 인코딩 이미지 Editor 등록 이슈
1. 문제 인식
다른 사이트의 이미지를 복사하여 게시글을 작성하면 이미지가 잘 등록되지만, 특정 이미지나 로컬에 저장된 이미지는 등록이 되지 않는 이슈가 있었습니다.
아래 사진과 같이 Editor에 분명히 로컬에 저장되어있는 이미지를 넣고 등록 버튼을 눌렀지만,

참고로 위 사진은 이슈를 해결하고 나서의 Editor라, 버전은 4.17.2입니다.
이슈가 발생했을 때의 Editor 버전은 4.13.2였습니다. 하지만 버전업이 근본적인 문제 해결책이 아닙니다.
4.17 버전부터 이미지를 Base64로 Editor에 끌어다 놓기를 허용하지만, 등록은 되지 않을 수 있습니다.
아래 사진을 보면 이미지는 사라져있습니다.

2. 문제 해결
lib/common.lib.php 파일을 찾습니다.
위 파일에서,
$config->set('Attr.AllowedFrameTargets','_blank, _self, _parent, _top' );
혹은
$config->set('Attr.AllowedFrameTargets', array('_blank'));
위와 같은 코드를 찾습니다.
만약 lib/common.lib.php 파일이 존재하지 않다면 위 코드를 갖고 있는 파일을 찾으시면 됩니다.
해당 코드 바로 아래에 다음 코드를 추가합니다.
$config->set('URI.AllowedSchemes', array('http' => true, 'https' => true, 'data' => true));
끝입니다.
만약 문제가 해결되지 않는다면, 캐시 비우기 및 강력 새로고침과 IDE 재시작을 추천드립니다.
3. 원인 분석
HTML Purifier
HTML Purifier는 웹 PHP 서비스 개발 시, XSS(cross-site scripting) 취약점을 보안하기 위해 HTML을 필터링 하는 라이브러리입니다.
게시판의 글 제목이나 글 내용 등에 script, mouse 이벤트, Error 등을 삽입하여 원하는 정보를 얻어내거나 공격하는 것을 방지합니다. 그래서 안전한 속성, 특정 이벤트, 태그 등만을 허용합니다.
CKEditor4 내에서 로컬 이미지를 삽입하면, 자동적으로 이미지가 Base64 String 값으로 변환되어 삽입됩니다.
Editor 내에 이미지를 삽입하는 것은 가능할 수 있으나, 문제는 게시글을 등록할 때 purify 함수가 사용됩니다.
이 과정에서 purify 함수가 인코딩된 Base64 String 값을 필터링하는 것 같습니다.
$config->set('URI.AllowedSchemes', array('http' => true, 'https' => true, 'data' => true));
위 코드에서 'data' => true
로 인하여 Base64 이미지를 등록할 수 있게됩니다.
이슈는 해결하였지만 보안적인 측면에서는 미흡한 부분이 있습니다.
장단점이 존재하는 해결방법입니다.
장점
- 별도의 이미지 파일이 필요 없습니다. Base64 인코딩된 String 값 자체가 이미지이기 때문에 별도의 이미지 파일이 없어도 브라우저에서 이미지를 렌더링 합니다.
- 브라우저가 이미지를 렌더링할 때, 문서 로딩이 끝난 후에 이미지를 렌더링합니다. 네트워크가 좋지 않으면 이미지가 로딩이 되지 않는 경우가 발생할 수 있는데, Base64 인코딩 이미지를 삽입하면 문서를 로딩할 때 Base64 이미지도 로딩되기 때문에 이러한 이슈가 사라집니다.
단점
- 용량이 커지기 때문에 DB에 부하가 걸릴 수 있습니다.
- 이미지 사이즈가 크게 되면, Base64 String 길이가 엄청나게 길어지는데, 이러면 소스의 가독성이 떨어질 수 있습니다.
- Base 64 인코딩 이미지를 많이 삽입할 경우, 문서 자체를 로딩하는데 많은 시간이 소요되기 때문에 속도 저하가 발생할 수 있습니다.
Base64
"Base64"는 64진법이라는 뜻입니다. 8비트 이진 데이터(예를 들어 실팽 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념입니다.
피드백 환영합니다.
'공부 || 정리 > 후기 || ETC' 카테고리의 다른 글
[공채 후기] 2022년 아프리카TV 웹 서비스 개발 공채 후기 (페이지/REST API직무, 1차면접, BTB 면접, 최종면접) (20) | 2022.02.05 |
---|---|
[공채 후기] 2021년 하반기 11번가 광고플랫폼 개발 공채 후기 (FE직무, 1차면접, 최종면접) (2) | 2022.02.04 |
[공채 후기] 2021년 하반기 다우기술 신입 공채 후기 (Web Application 개발, 1차 면접) (17) | 2022.02.03 |
[Error] Github Support for password authentication error 해결법 (0) | 2021.08.15 |
[코테 후기] 21년 라인 AD 플랫폼 인턴 코딩 테스트 후기 (3) | 2021.05.01 |
댓글
이 글 공유하기
다른 글
-
[공채 후기] 2022년 아프리카TV 웹 서비스 개발 공채 후기 (페이지/REST API직무, 1차면접, BTB 면접, 최종면접)
[공채 후기] 2022년 아프리카TV 웹 서비스 개발 공채 후기 (페이지/REST API직무, 1차면접, BTB 면접, 최종면접)
2022.02.05자기소개서 (서류 전형) 저는 웹 서비스 개발(웹 서비스 페이지 / REST API) 부문 지원자였습니다. 자기소개서는 모든 문항을 500자 이내로 작성해야 했습니다. 이 부분은 좋았습니다. 자기소개서를 제외하고 이력서에 블로그, 포트폴리오 링크를 작성하였습니다. 제가 지원한 부문은 따로 코딩 테스트를 진행하지 않았습니다. 여러 리뷰를 찾아봤을 때, 사전 테스트가 있다고 했지만 따로 저는 보지 않았습니다. 하지만 코딩 테스트 혹은 사전 과제가 있던 직무도 있었습니다. 서류를 합격하면 바로 1차 면접이었습니다. 1차 면접 1차 면접은 대면 다대다 면접으로 진행됐습니다. 3(지원자) : 4(면접관) 면접이었습니다. 자유 복장이었습니다. 1차 면접은 위 건물 1층에서 진행했습니다. 대면 면접은 정말 오랜만이라… -
[공채 후기] 2021년 하반기 11번가 광고플랫폼 개발 공채 후기 (FE직무, 1차면접, 최종면접)
[공채 후기] 2021년 하반기 11번가 광고플랫폼 개발 공채 후기 (FE직무, 1차면접, 최종면접)
2022.02.04 -
[공채 후기] 2021년 하반기 다우기술 신입 공채 후기 (Web Application 개발, 1차 면접)
[공채 후기] 2021년 하반기 다우기술 신입 공채 후기 (Web Application 개발, 1차 면접)
2022.02.03 -
[Error] Github Support for password authentication error 해결법
[Error] Github Support for password authentication error 해결법
2021.08.15최근 Github에서 push, pull, clone 등 행동을 할 때 로그인이 안되거나, 위와 같은 메시지를 마주치신 분이 있으실 겁니다. 저는 push에서 위와 같은 이슈가 발생했습니다. GIthub에서 2021년 8월 13일부터 비밀번호 사용을 차단하여 생긴 이슈였습니다. 보안 이슈때문에 비밀번호 사용을 금지한 것 같은데 자세한 사항은 위 사진에 적혀있는 깃헙 링크에 가셔서 확인해주시길 바랍니다. 저는 아래와 같이 해결하였습니다. Github 프로필을 눌러서 Setting -> Developer settings -> Generate new token을 클릭합니다. 그 다음 패스워드를 입력하여 들어갑니다. 위 화면에서 토큰을 생성합니다. Select scopes에서 어떤 것을 선택하실지 많이 망설여지…
댓글을 사용할 수 없습니다.