fix(security): 보안 제보 14건 + 유사 결함 전수조사 수정

sir.kr 커뮤니티 제보(Xbuilder 님 외)와 전수조사 발굴분을 코어·게시판·
이커머스·페이지·ckeditor5 전반에 반영.

- 통합 검색 하이라이트: 코어 SearchHighlighter 로 원문 이스케이프 후 강조
 (저장형 XSS 차단, board/ecommerce/page 3중복제 통합)
- 공개 최신글·인기글·관리자 대시보드: 읽기권한 없는 게시판·블라인드·비활성
 게시판 글 필터. 비밀글은 기존 공개 정책대로 제목 노출 유지(본문만 보호)
- 게시판 관리 대시보드 권한 게이트, 이커머스 쿠폰 다운로드·리뷰 대상·주문옵션
 확정 스코프 강화, 취소/환불 항목 검증 회원/비회원 대칭
- 만료 토큰 거부(SetLocale), 회원 탈퇴·정보관리 실패 시 내부 오류 원문 마스킹
- 예외→응답 매핑 정비(generic catch 상태코드), ckeditor 업로드 권한 게이트 정리

정책 정합 정정: 착수 계획이 "비밀글 제목 노출=취약점"으로 전제해 공개 최신글·
대시보드에 넣었던 is_secret 필터는, 저장소가 확정한 "제목 공개, 본문만 보호"
정책(2026-01-02/02-04/06-18/06-19)과 배치되어 되돌림. 읽기권한·블라인드 필터는 유지.
Chrome MCP 실측(T1~T10) + 회귀 테스트로 확인.
This commit is contained in:
HeuJung committed 2026-08-17 15:46:38 +09:00
1 parent 2b5972437b
commit cf1d8ab52c
84 files changed
+3195 -246

No files matched your search

+11 -4
View File
@@ -2,11 +2,11 @@
namespace App\Http\Middleware;
use App\Models\User;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Laravel\Sanctum\PersonalAccessToken;
use Symfony\Component\HttpFoundation\Response;
@@ -75,9 +75,9 @@ class SetLocale
* 따라서 Bearer 토큰을 직접 파싱하여 사용자를 가져옵니다.
*
* @param Request $request HTTP 요청
* @return \App\Models\User|null 사용자 또는 null
* @return User|null 사용자 또는 null
*/
private function resolveUser(Request $request): ?\App\Models\User
private function resolveUser(Request $request): ?User
{
// 이미 인증된 경우 (세션 기반 인증)
if (Auth::check()) {
@@ -88,7 +88,14 @@ class SetLocale
$bearerToken = $request->bearerToken();
if ($bearerToken) {
$token = PersonalAccessToken::findToken($bearerToken);
if ($token && $token->tokenable instanceof \App\Models\User) {
// 만료된 토큰은 인증되지 않은 것으로 취급 (guest 로케일 폴백).
// OptionalSanctumMiddleware 와 동일한 만료 검사를 적용한다.
if ($token && $token->expires_at && $token->expires_at->isPast()) {
return null;
}
if ($token && $token->tokenable instanceof User) {
return $token->tokenable;
}
}