core/ — CMS 엔진
CMS 의 핵심 기능이 모두 담긴 폴더입니다. 직접 수정을 권장하지 않으며, 업데이트 시 이 폴더가 교체됩니다. 보안 패치는 예외적으로 core/Secure.php 한 파일만 수정하면 됩니다.
수정 지침
- 기능 추가 → extend/ 폴더 또는 plugins/ 폴더를 이용하세요
- 화면 수정 → themes/ 폴더의 스킨 파일을 수정하세요
- 보안 패치 → core/Secure.php (또는 core/security/{hash}/Secure.php) 만 수정하세요
- DB 쿼리 추가 → routes/ + controllers/ 또는 extend/ 를 활용하세요
1 functions.php — 전역 헬퍼 함수
index.php 에서 가장 먼저 로드되는 파일로, 클래스보다 앞서 전역 함수를 정의합니다. 모든 PHP 파일에서 접두사 dx_ 로 사용할 수 있습니다.
| 함수 그룹 |
주요 함수 |
설명 |
| 보안 난수 |
dx_random_bytes()` / `dx_random_hex() |
PHP 5.6~8.x 호환 안전 난수 (random_bytes → openssl → mcrypt → mt_rand 폴백) |
| 경로 유틸 |
dx_realpath()` / `dx_path_inside() |
크로스 플랫폼 경로 처리 (Windows \ → / 자동 변환) |
| URL 처리 |
dx_base_url()` / `dx_request_uri() |
베이스 URL 생성, 현재 요청 URI 정규화 |
| 출력 보안 |
dx_esc()` / `dx_esc_attr()` / `dx_esc_js() |
XSS 방어 출력 이스케이프 (HTML/속성/JS 컨텍스트별) |
| CSRF |
dx_csrf_token()` / `dx_csrf_field()` / `dx_csrf_check() |
Secure 클래스 위임 — 기존 코드 호환 유지 |
| 설정 |
dx_config()` / `dx_set_config() |
전역 $dx_config 배열 안전 접근 |
| DB 단축 |
dx_db()` / `dx_find()` / `dx_rows() |
QueryBuilder 및 Database 단축 함수 |
| 테마 |
dx_theme_option()` / `dx_menu_group() |
테마 옵션, 메뉴 그룹 조회 |
| 리다이렉트 |
dx_redirect()` / `dx_error() |
헤더 리다이렉트, HTTP 오류 응답 |
| 로그 |
dx_log()` / `dx_error_log() |
data/error.log 기록 |
3.2 Secure.php — 보안 전담 클래스
CMS 의 모든 보안 로직이 집약된 단일 파일입니다. 설치 시 16자리 해시 경로에 복사되어 경로가 난독화됩니다.
// 실제 로드 경로 (index.php STEP 1)
// 1순위: core/security/{DX_SECURITY_PATH}/Secure.php
// 2순위: core/Secure.php (파일 손실 또는 신규 설치 전 폴백)
// DX_SECURITY_PATH = 설치 시 생성된 16자리 랜덤 해시
// → 소스코드 유출 시에도 Secure.php 위치 예측 불가
| 담당 기능 |
구현 방식 |
| 세션 보안 |
HttpOnly • Secure • SameSite=Lax 쿠키 플래그 + 세션 토큰 검증 |
| CSRF 방어 |
TTL 3시간 토큰 발급/검증, 하트비트로 자동 갱신 |
| 보안 헤더 |
X-Frame-Options • X-Content-Type-Options • Referrer-Policy • CSP Nonce |
| WAF |
SQL Injection • XSS 패턴 탐지 (에디터 필드는 오탐 방지 제외) |
| Rate Limit |
Redis 기반 (파일 fallback) — 10초 내 60회, IP별 분당 200회 |
| 파일 업로드 검증 |
MIME + 확장자 이중 검증 + getimagesize() 실제 이미지 확인 |
| 비밀번호 해시 |
bcrypt (PHP 5.6 polyfill 포함) |
| 시크릿 키 |
DX_SECRET_KEY → 세션/CSRF 키 이름 동적 도출 (사이트마다 고유) |
3.3 핵심 Dx*.php 클래스 파일 (21개)
| 파일명 |
역할 요약 |
| DxCache.php |
멀티 드라이버 캐시 — Redis → APCu → 파일 → None 자동 선택 |
| DxSeo.php |
SEO 헬퍼 — OG/Twitter Card, JSON-LD 구조화 데이터, 동적 사이트맵•robots.txt |
| DxCategory.php |
DB 기반 무한 깊이 카테고리 렌더링 + 스킨 폴백 |
| DxSanitizer.php |
입력 정제•HTML 필터링 (XSS 공격 방지) |
| DxTheme.php |
테마 엔진 — 폴백 체인 resolve(), 변수 주입 render() |
| DxSite.php |
멀티사이트 — HTTP_HOST 감지 → 도메인별 dx_config 오버라이드 |
| DxExtend.php |
extend/ 폴더 자동 실행 엔진 (오류 격리 포함) |
| DxPoint.php |
포인트•경험치•레벨 시스템 — 게시글•댓글•추천 시 자동 적립 |
| DxBoardSkin.php |
게시판 스킨 폴백 체인 (6단계 탐색) |
| DxMarket.php |
플러그인 마켓 — 상품 등록•구매•라이선스 관리 |
| PluginRegistry.php |
플러그인 등록•활성화 관리 (dx_register_plugin) |
| DxRouter.php |
라라벨 스타일 라우터 (GET/POST/PUT/PATCH/DELETE/resource/group) |
| DxContainer.php |
DI 컨테이너 — bind/singleton/instance/alias, 컨트롤러 자동 로드 |
| DxMailer.php |
메일 발송 — 드라이버 패턴 (SMTP/sendmail/PHP mail) |
| DxSms.php |
SMS 발송 — 드라이버 패턴 (CoolSMS/NCP/KT Bizmeka/Twilio) |
| DxSocialAuth.php |
소셜 로그인 OAuth2 처리 (카카오•네이버•구글•GitHub) |
| DxShop.php |
쇼핑몰 기능 — 상품•주문•결제 플러그인 연동 |
| DxNotification.php |
실시간 알림 시스템 — 생성•조회•읽음 처리 |
| DxPopup.php |
팝업 렌더링 — dx_body_bottom 훅에 자동 등록 |
| DxThumb.php |
이미지 썸네일 생성 — GD 리사이즈 + 투명 PNG 처리 |
| DxCss.php |
CSS 변수 동적 생성 (테마 색상 주입) |
| DxCaptcha.php |
캡차 드라이버 관리자 (Built-in/reCAPTCHA v2•v3/hCaptcha/Turnstile) |
| DxMigration.php |
DB 마이그레이션 자동 실행 |
| DxMemberMonitor.php |
회원 온라인 상태 추적 (last_seen 갱신) |
| DxFriend.php |
친구•팔로우 기능 |
3.4 core/api/ — 내부 API 핸들러 (25개)
AJAX 요청 등 프론트엔드에서 직접 호출하는 API 엔드포인트 파일들입니다. URL 패턴은 /api/{파일명} 형식이며, 모든 파일은 CSRF 검증을 포함합니다.
| 파일 |
URL 예시 |
기능 |
| upload.php |
/api/upload |
파일 업로드 — MIME•이중확장자 검증, 멀티 업로드 |
| download.php |
/api/download |
파일 다운로드 — 권한 검증, 다운로드 수 증가 |
| comment.php |
/api/comment |
댓글 CRUD — 작성•수정•삭제•목록 |
| comment_delete.php |
/api/comment_delete |
댓글 hard delete + 좋아요 일괄 삭제 |
| post_delete.php |
/api/post_delete |
게시글 완전 삭제 — 첨부파일•댓글•좋아요•스크랩 |
| like.php |
/api/like |
좋아요 토글 (게시글•댓글) |
| scrap.php |
/api/scrap |
스크랩 토글 |
| sitemap.php |
/api/sitemap |
동적 XML 사이트맵 인덱스•게시글 페이지 |
| robots.php |
/api/robots |
동적 robots.txt 생성 |
| notification.php |
/api/notification |
알림 목록•읽음 처리•전체 삭제 |
| memo.php |
/api/memo |
쪽지 발송•조회 |
| friend.php |
/api/friend |
친구•팔로우 추가•삭제 |
| chat_dm.php |
/api/chat_dm |
실시간 DM 메시지 |
| draft_save.php |
/api/draft_save |
게시글 임시저장 |
| draft_load.php |
/api/draft_load |
임시저장 불러오기 |
| shop.php |
/api/shop |
쇼핑몰 주문•결제 API |
| csrf_refresh.php |
/api/csrf_refresh |
CSRF 토큰 갱신 (하트비트) |
| member_profile.php |
/api/member_profile |
회원 프로필 정보 조회 |
| post_row.php |
/api/post_row |
단일 게시글 HTML 행 반환 (실시간 갱신용) |
| captcha_image.php |
/api/captcha_image |
Built-in 캡차 이미지 생성 |
| check_duplicate.php |
/api/check_duplicate |
아이디•이메일 중복 확인 |
| global_notice_row.php |
/api/global_notice_row |
전역 공지사항 행 반환 |
| js_log.php |
/api/js_log |
프론트엔드 에러 로그 수신 |
| link_click.php |
/api/link_click |
링크 클릭 통계 기록 |
| receive_socket_key.php |
/api/receive_socket_key |
WebSocket 인증 키 발급 |
3.5 core/auth/ — 인증 핸들러 (16개)
로그인•회원가입•마이페이지•소셜 로그인 처리 파일들입니다. Dispatcher 가 /auth/* URL 을 이 폴더로 라우팅합니다.
| 파일 |
URL |
기능 |
| Auth.php |
(클래스) |
세션 인증 싱글턴 — isLoggedIn, isAdmin, login, logout |
| login.php |
/auth/login |
로그인 폼 GET + POST 처리 |
| logout.php |
/auth/logout |
세션 파기 + 리다이렉트 |
| register.php |
/auth/register |
회원가입 폼 + DB 저장 + 이메일 인증 |
| mypage.php |
/auth/mypage |
마이페이지 — 내 게시글•댓글•스크랩•알림•포인트 |
| profile.php |
/auth/profile |
프로필 수정 — 이미지•자기소개•SNS |
| social.php |
/auth/social |
소셜 로그인 선택 화면 |
| social_callback.php |
/auth/social_callback |
공통 소셜 콜백 처리 |
| kakao.php / kakao_callback.php |
/auth/kakao |
카카오 OAuth2 인증 |
| naver.php / naver_callback.php |
/auth/naver |
네이버 OAuth2 인증 |
| google.php / google_callback.php |
/auth/google |
구글 OAuth2 인증 |
| github.php / github_callback.php |
/auth/github |
GitHub OAuth2 인증 |
| _social_common.php |
(공통) |
소셜 로그인 공통 로직 (계정 연결•신규 생성) |
| _social_notice.php |
(공통) |
소셜 로그인 결과 알림 HTML |
3.6 core/db/ — 데이터베이스 레이어
core/db/
├── Database.php ← PDO 래퍼 싱글턴 (연결•쿼리•트랜잭션)
└── QueryBuilder.php ← 메서드 체이닝 쿼리 빌더 + dx_db() 전역 함수
- Database::getInstance() — PDO 싱글턴, prefix 자동 처리 (dx_posts → 실제 테이블명)
- Database::row() / rows() / insert() / update() / delete() / find() / count()
- QueryBuilder: dx_db('posts')->where('status',1)->orderBy('id','DESC')->limit(10)->get()
- 트랜잭션: beginTransaction() / commit() / rollback()
3.7 core/router/ — 라우팅 레이어
core/router/
├── Router.php ← URL 파싱 + 라우트 타입 결정 (home/board/page/admin/auth/api/search/404)
└── Dispatcher.php ← 라우트 타입 → 핸들러 파일 실행 위임
Router.php 는 URL 세그먼트를 분석하여 요청 타입(TYPE_HOME, TYPE_BOARD, TYPE_PAGE, TYPE_ADMIN, TYPE_AUTH, TYPE_API, TYPE_SEARCH, TYPE_404)을 결정합니다. Dispatcher.php 는 그 결과를 받아 실제 핸들러 파일(boards/handler.php, admin/index.php 등)로 실행을 위임합니다.
라우터 타입 결정 우선순위
① /admin → TYPE_ADMIN → admin/index.php
② /auth/* → TYPE_AUTH → core/auth/{액션}.php
③ /api/* → TYPE_API → core/api/{엔드포인트}.php
④ /search → TYPE_SEARCH → core/search/handler.php
⑤ / → TYPE_HOME → pages/home.php 또는 테마 page/home.php
⑥ /{slug} → DB에서 pages 테이블 조회 → 있으면 TYPE_PAGE
⑦ /{key}/* → DB에서 boards 테이블 조회 → 있으면 TYPE_BOARD
⑧ 없음 → TYPE_404 → 테마 page/404.php
3.8 core/hook/ — 훅 시스템
HookManager.php 하나로 구성된 이벤트 버스입니다. WordPress의 add_action / apply_filters 와 동일한 철학으로 Action Hook (실행) 과 Filter Hook (값 변환) 두 종류를 지원합니다.
// Action Hook — 특정 시점에 코드 실행 (반환값 없음)
dx_add_hook('dx_body_bottom', function() {
echo '<script src="/custom.js"></script>';
}, 10); // 우선순위 10 (낮을수록 먼저 실행)
// Filter Hook — 값을 받아 변환 후 반환
dx_add_filter('dx_board_content', function($content, $args) {
return nl2br($content);
}, 20);
3.9 core/captcha/ — 캡차 드라이버
core/captcha/
├── DxCaptchaDriverInterface.php ← 드라이버 인터페이스 (render, verify 메서드)
├── DxBuiltinDriver.php ← 자체 GD 이미지 캡차 (외부 의존 없음)
├── DxRecaptchaV2Driver.php ← Google reCAPTCHA v2 (체크박스)
├── DxRecaptchaV3Driver.php ← Google reCAPTCHA v3 (점수 기반)
├── DxHcaptchaDriver.php ← hCaptcha
└── DxTurnstileDriver.php ← Cloudflare Turnstile
DxCaptcha.php (core 루트) 가 설정에 따라 적절한 드라이버를 선택하여 실행합니다. 관리자 > 사이트 설정에서 캡차 종류를 변경할 수 있으며, 코드 수정 없이 교체됩니다.
3.10 core/mailer/ — 메일 드라이버
core/mailer/
├── DxMailDriverInterface.php ← 드라이버 인터페이스 (send 메서드)
├── DxMailMessage.php ← 메일 메시지 DTO (from/to/subject/body/attachments)
├── DxMailFuncDriver.php ← PHP mail() 함수 드라이버 (공유호스팅용)
├── DxSendmailDriver.php ← sendmail 프로그램 드라이버
└── DxSmtpDriver.php ← SMTP 드라이버 (TLS/SSL, 인증 지원)
3.11 core/sms/ — SMS 드라이버
core/sms/
├── DxSmsDriverInterface.php ← 드라이버 인터페이스 (send 메서드)
├── DxCoolSmsDriver.php ← CoolSMS (국내)
├── DxNcpSmsDriver.php ← NAVER Cloud Platform SMS
├── DxKtBizmekaDriver.php ← KT Bizmeka (알림톡•친구톡 지원)
└── DxTwilioDriver.php ← Twilio (해외)