Files
Gnuboard5/tests/README.cart-validation.md
whitedot 40096220e2 security: KVE-2026-2345 실제 설치 환경 검증 결과 기록
PHP·MySQL 실제 설치 환경의 수정 전 재현과 수정 후 차단, 정상 주문 저장 등 46개 시나리오 결과를 기록한다. 실제 PG와 브라우저 UI 등 미검증 범위를 구분한다.
2026-09-10 05:17:59 +00:00

5.2 KiB

장바구니 옵션 검증 테스트

KVE-2026-2345 수정의 회귀 검증이다. 운영 DB·PG를 사용하지 않는다.

공통 규칙

php tests/shop_cart_validation.php

DB 연결 없이 기본상품·선택옵션·추가옵션, 잘못된 종류·수량·재고, 정상 0원 상품, 과거 조작 행과 가격 변경을 검증한다.

HTTP 및 MySQL

별도로 초기화한 테스트 전용 MySQL 서버의 Unix 소켓을 전달한다. PHP CLI의 mysqli, Python 3, mysql 클라이언트와 해당 테스트 서버의 비밀번호 없는 root 계정이 필요하다.

python3 tests/shop_cart_http.py /tmp/kve2345-mysql.sock

실행마다 고유한 kve2345_test_* DB를 생성하고 종료 시 삭제한다. 저장소 설치 SQL에서 상품·옵션·장바구니 테이블을 생성하며 MyISAM과 InnoDB에서 같은 검증을 수행한다. DB 엔진을 변환하는 대상은 생성된 테스트 테이블뿐이다.

공통 AJAX, 기본 테마 AJAX, 일반 장바구니 처리 파일을 임시 디렉터리에 복사하여 로컬 HTTP 서버로 실행한다. 인증·세션·리다이렉트 등 주변 기능은 테스트 부트스트랩으로 대체하고, SQL은 실제 MySQL에서 실행한다. 잘못된 요청이 DB를 바꾸지 않는지와 정상 추가·수량 병합·옵션별 합계를 확인한다.

PC·모바일 주문 처리 파일은 추가한 장바구니 검증 경계까지만 실행한다. 따라서 이 테스트는 실제 PG 승인·취소, 주문 저장 완료, 쿠폰·포인트·배송비 후속 정산, 실제 로그인·구매 권한, 브라우저 UI 또는 동시 요청 검증을 대신하지 않는다. 이 항목들은 배포 전 별도의 통합 환경에서 확인해야 한다.

구현 범위

두 AJAX 경로와 일반 추가 경로는 요청 전체의 상품·옵션 구성을 검증한 후 기존 변경 로직으로 진행한다. 옵션 종류·가격은 검증한 서버 데이터에서 가져온다. 주문 준비 및 PC·모바일 주문 제출은 선택된 기존 장바구니 행도 검증하여 과거 조작 행과 가격 불일치를 거부한다. 정상 무료상품은 허용한다.

기존 테이블 엔진과 장바구니·주문 전체의 트랜잭션은 변경하지 않는다. 따라서 사전 검증 이후의 DB 오류·동시 변경까지 모든 처리가 원자적이라고 보장하는 변경은 아니다.

후속 검토 회귀 검증

python3 tests/shop_cart_followup.py /path/to/php -n -d extension=pdo_sqlite

PHP의 확장 경로 설정이 필요한 환경에서는 -d extension_dir=/path/to/ext도 전달한다. Python 표준 라이브러리와 PHP PDO SQLite를 사용하며, 테스트 전용 임시 디렉터리와 SQLite DB는 종료 시 정리한다. -n은 실제 cURL 확장을 로드하지 않고 모의 승인 응답을 사용하기 위한 설정이다.

25개 검증에서 세 추가 경로의 기존 가격 불일치·누적 재고·최대 수량·다중 상품 실패 시 행 보존과 정상 병합을 확인한다. 일반 추가의 바로구매 실패 시 선삭제 방지, 정상 옵션 교체, 뒤쪽 상품의 구매 자격 거부 시 행 보존도 확인한다. 실제 모바일 이니시스 승인 파일에서 모의 승인 응답을 거쳐 실제 모바일 주문 검증·취소 연결 파일을 실행하여 승인 전 차단, 승인 도중 가격 변경·장바구니 삭제, 취소 성공·실패, 기존 로그 갱신, 정상 검증 통과 및 위조 해시에 대한 취소 미실행을 확인한다.

기존 행 병합 결과는 모든 상품에 대해 변경 전에 검사한다. 모바일 이니시스는 승인 전에 장바구니를 검사하고, 승인 후 주문 검증 실패 시 서버 세션과 해시로 확인한 거래번호를 기존 INIAPI 취소 함수에 전달한다. 취소 응답이 성공일 때만 취소 완료를 안내하며, 실패는 로그와 확인 필요 안내를 남긴다.

이 검증의 SQL은 SQLite에서 실행하므로 MyISAM·InnoDB 테스트를 대체하지 않는다. PG 승인 응답과 취소 API는 모의 구현이며 실제 PG의 취소 성공이나 전체 주문 저장 완료를 검증한 결과가 아니다. 승인 이후 검사와 저장 사이의 동시 변경, 통신 실패 후 운영 복구, 실제 PG 통합 검증은 별도로 필요하다.

실제 설치 환경 검증 기록

2026-09-10에 PHP 8.4.25와 MySQL 8.0.46의 별도 로컬 프로세스로 수정 전·후 영카트를 실제 설치하여 HTTP 요청부터 무통장 주문 저장까지 확인했다. 공통 초기화·인증·주문 코드를 대체하거나 중간에서 종료하지 않았다. 이 실행은 위 단위/모의 테스트와 별도의 검증이다.

보고서는 해당 커밋과 환경에서 수행한 검증 기록이며 자동 재실행 도구가 아니다. DB 접속 설정, 비밀번호, 세션 파일과 테스트 DB는 저장소에 포함하지 않는다. 실제 PG 승인·취소와 브라우저 JavaScript, 동시성, 쿠폰·포인트 등 전체 정산은 이 검증에 포함되지 않는다.