보관함과 상품판매순위에서 날짜 전체 형식·실제 달력 날짜·기간 순서를 검증하고 잘못된 요청을 조회 전에 HTTP 400으로 거부한다. 날짜 출력과 조회 링크를 각각 인코딩하고 최초 조회·분류·정렬·페이징을 유지한다. 검증: 변경 PHP 문법 검사, 100개 잘못된 날짜 입력과 정상 조회·윤년·페이징 회귀 검사, Chromium 속성 주입 및 이벤트 차단 검사 통과. 실제 관리자 세션과 운영 DB 검증 및 배포는 미실행.
3.8 KiB
KVE-2026-2344 관리자 날짜 필터 보완
보관함(wishlist.php, 메뉴 500140)과 상품판매순위(itemsellrank.php, 메뉴 500100)의 날짜 필터를 보완했다. 기존에는 입력에 숫자가 하나라도 있으면 원문을 허용하고 HTML 속성에 직접 출력하여 반사 XSS가 발생할 수 있었다.
변경 동작
- 두 화면은 공통
date_filter.lib.php로 날짜를 검사한다. 관리자 권한 확인 뒤, 화면 헤더 출력과 조회 SQL 실행 전에 검증한다. fr_date와to_date는 모두 문자열이며 8자리 ASCII 숫자여야 한다.checkdate()로 실제 날짜인지 확인하고 시작일이 종료일보다 늦으면 거부한다.- 날짜 파라미터가 하나라도 전달되면 두 값 모두 유효해야 한다. 배열·빈 문자열·한쪽 누락·개행·잘못된 달력 날짜·기간 역전은 HTTP 400과 고정 안내 문구로 거부한다. 공격 문자열은 안내에 반영하지 않는다.
- 날짜 파라미터가 모두 없는 최초 조회는 전체 기간을 조회한다. 보관함은 빈 날짜, 판매순위는 기존과 같이 종료일에 오늘 날짜를 표시한다.
- 날짜 input은
htmlspecialchars의ENT_QUOTES | ENT_SUBSTITUTE와 UTF-8로 인코딩한다. - 페이지 이동·정렬 링크의 필터는
http_build_query로 URL 인코딩하고 HTML 속성에 맞게 인코딩한다. 필터를 사용하지 않은 조회에서는 빈 날짜를 링크에 넣지 않는다. 페이지 이동 중 분류·날짜·정렬 조건을 유지한다.
일반 관리자 권한 검사와 상품·회원·주문 데이터 저장 동작은 변경하지 않는다. 스키마 변경이나 데이터 마이그레이션은 필요하지 않다.
검증
php tests/admin_date_filter.php
node tests/admin_date_filter.js
브라우저 검증에는 Playwright와 Chromium이 필요하다. 별도 설치 경로를 사용하는 경우 PLAYWRIGHT_MODULE과 CHROME_EXECUTABLE 환경변수로 지정할 수 있다.
PHP 검증은 실제 두 페이지를 실행하며 인증·DB·공통 헤더는 대역을 사용한다. 실제 입력·출력·페이징 및 정렬 함수로 다음을 확인한다.
- 두 페이지와 두 날짜 필드에 대한 100개 잘못된 입력의 HTTP 400 거부 및 조회 SQL 미실행
- 한쪽 날짜 누락, 명시적 빈값, 기간 역전 거부
- 최초 전체 조회와 페이지 이동, 윤년 정상 조회, 분류 필터와 정렬 조건 유지
- Chromium에서 추가 이벤트 속성과 스크립트 실행 표식이 생성되지 않음
- 검증 단계와 별도로, 실제 input 출력문에 속성 주입 문자열을 넣어도 출력 인코딩으로 값 안에만 남고 포커스 이벤트가 실행되지 않음
운영 DB·실제 관리자 세션을 사용하거나 회원 권한을 변경하는 검증은 수행하지 않는다. 배포 전 운영과 동등한 격리 환경에서 관리자 로그인·권한별 접근과 정상 조회를 추가 확인한다.
배포 및 보고 상태
현재 상태는 코드 수정 및 격리 회귀 검증 완료다. 운영 반영과 수정 버전 배포 완료를 의미하지 않는다. 배포 버전·배포일은 확정 후 별도로 기록한다.
인터넷진흥원 중간 회신 문구:
KVE-2026-2344와 관련하여 관리자 보관함 및 동일 원인이 확인된 상품판매순위의 날짜 입력 검증과 출력 인코딩을 보완하였습니다. 잘못된 날짜 입력은 조회 전에 거부하도록 수정하였으며, 정상 조회·정렬·페이지 이동과 브라우저의 이벤트 실행 차단을 격리 환경에서 검증하였습니다. 현재 코드 수정 및 회귀 검증을 완료한 상태이며, 운영 반영 및 배포 버전·배포일은 확정 후 조치 결과와 함께 별도 통보하겠습니다.