dx-ck-pro 패치 내역
버전 정보
| 항목 | 내용 |
|---|---|
| 플러그인 | dx-ck-pro (DX CKEditor Pro) |
| 패치 날짜 | 2026-09-06 |
패치 1 — 댓글/답글 이미지 업로드 403 오류
증상
댓글 수정 및 답글 작성 시 이미지 업로드 실패.
POST /api/upload 403 (Forbidden)
댓글 새 작성은 정상, 댓글 수정과 답글에서만 발생.
원인
comment-override.js의 CKEDITOR.replace() 설정에서 fileUploadRequest 이벤트 핸들러가 누락되어 있었습니다.
CKEditor는 드래그&드롭 또는 붙여넣기로 이미지를 업로드할 때 fileUploadRequest 이벤트를 발사하고, 이 이벤트 핸들러에서 XHR 헤더를 설정합니다. 핸들러가 없으면 X-CSRF-Token 헤더가 전송되지 않아 서버의 CSRF 검증에서 403이 반환됩니다.
일반 글쓰기 에디터(js_builder.php)에는 핸들러가 있어 정상 동작했으므로 댓글/답글에서만 증상이 나타났습니다.
수정 파일
plugins/dx-ck-pro/js/comment-override.js
변경 내용
on 블록의 instanceReady 다음에 fileUploadRequest, fileUploadResponse 핸들러 추가.
// 추가된 코드
fileUploadRequest: function (evt) {
if (USE_UPLOAD && CSRF) {
evt.data.fileLoader.xhr.setRequestHeader('X-CSRF-Token', CSRF);
}
},
fileUploadResponse: function (evt) {
if (!USE_UPLOAD) return;
evt.stop();
var loader = evt.data.fileLoader;
var r;
try { r = JSON.parse(loader.xhr.responseText); } catch (e) {}
if (!r) { evt.cancel(); return; }
if (r.uploaded && r.url) evt.data.url = r.url;
else if (r.success && r.files && r.files.length) evt.data.url = (r.baseurl || '') + (r.path || '') + r.files[0];
else if (r.location) evt.data.url = r.location;
else if (r.urls && r.urls.length) evt.data.url = r.urls[0];
else evt.cancel();
}
영향 범위
| 기능 | 패치 전 | 패치 후 |
|---|---|---|
| 댓글 새 작성 — 이미지 업로드 | ✅ 정상 | ✅ 정상 |
| 댓글 수정 — 이미지 업로드 | ❌ 403 | ✅ 정상 |
| 답글 — 이미지 업로드 | ❌ 403 | ✅ 정상 |
| 일반 글쓰기 — 이미지 업로드 | ✅ 정상 | ✅ 정상 |
패치 2 — 콘솔 디버그 로그 제거
증상
브라우저 개발자 도구 콘솔에 디버그 로그가 출력되어 운영 환경에 불필요한 정보가 노출됨.
[DX-CKPro][EMOTICON] 로드됨
[DX-CKPro][LINKPASTE] 로드됨
[DX-CKPro][QUOTE] 로드됨
[DX-FileLoad][INIT] 시작
[DX-FileLoad][INIT] _dxProPluginBase :: "..."
[DX-FileLoad][INIT] _dxProMammothUrl :: "..."
[DX-CKPro][LAYOUT] 로드됨
[DX-CKPro][CODE] 로드됨
[DX-CKPro][INIT] 에디터 초기화 edId=dxpro_comment_content_...
[DX-CKPro][INIT] _dxProPluginBase=...
[DX-CKPro][INIT] _dxProMammothUrl=...
[DX-CKPro][INIT] _dxProEmoticonTabs count=11
[dxtablegrid] plugin.js loaded
[dxtablegrid] plugin init, editor=...
[dxtablegrid] instanceReady, editor=...
원인
개발 단계에서 추가된 console.log 및 dxLog() 호출이 운영 배포본에 그대로 포함됨.
수정 파일 및 내용
| 파일 | 제거한 로그 |
|---|---|
plugins/dx-ck-pro/plugin.php |
dxLog 함수 내 console.log / instanceReady의 [DX-CKPro][INIT] 4줄 |
plugins/dx-ck-pro/js/emoticon.js |
[DX-CKPro][EMOTICON] 관련 dxLog 호출 |
plugins/dx-ck-pro/js/layout-modal.js |
[DX-CKPro][LAYOUT] 관련 dxLog 호출 |
plugins/dx-ck-pro/js/quote-modal.js |
[DX-CKPro][QUOTE] 관련 dxLog 호출 |
plugins/dx-ck-pro/js/code-modal.js |
[DX-CKPro][CODE] 관련 dxLog 호출 |
plugins/dx-ck-pro/js/linkpaste.js |
[DX-CKPro][LINKPASTE] 관련 dxLog 호출 |
plugins/dx-ck-pro/js/fileload.js |
[DX-FileLoad][INIT] 관련 console.log 호출 |
assets/ckeditor4-pro/plugins/dxtablegrid/plugin.js |
[dxtablegrid] 관련 console.log 호출 |
서버 측 로깅(data/ck_error.log)은 유지됩니다. 콘솔 출력만 제거했습니다.
설치 방법
압축 해제 후 DXCMS 루트에 덮어쓰기.
assets/
ckeditor4-pro/
plugins/
dxtablegrid/
plugin.js ← 패치 2
plugins/
dx-ck-pro/
plugin.php ← 패치 2
js/
comment-override.js ← 패치 1
code-modal.js ← 패치 2
emoticon.js ← 패치 2
fileload.js ← 패치 2
layout-modal.js ← 패치 2
linkpaste.js ← 패치 2
quote-modal.js ← 패치 2