Files
HeuJung cf1d8ab52c 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) + 회귀 테스트로 확인.
2026-08-17 15:46:38 +09:00

147 lines
7.8 KiB
PHP

<?php
return [
// Status labels
'status' => [
'active' => 'Active',
'inactive' => 'Inactive',
'blocked' => 'Blocked',
'withdrawn' => 'Withdrawn',
],
// Language labels
'language' => [
'ko' => '한국어',
'en' => 'English',
],
// User management messages
'not_found' => 'User not found.',
'withdrawn_user' => 'Deleted User',
'fetch_success' => 'User information retrieved successfully.',
'fetch_failed' => 'Failed to retrieve user information.',
'create_success' => 'User created successfully.',
'create_failed' => 'Failed to create user. Please try again later.',
'update_success' => 'User information updated successfully.',
'update_failed' => 'Failed to update user information. Please try again later.',
'delete_success' => 'User deleted successfully.',
'delete_failed' => 'Failed to delete user. Please try again later.',
'statistics_success' => 'User statistics retrieved successfully.',
'statistics_failed' => 'Failed to retrieve user statistics.',
'search_success' => 'User search completed successfully.',
'search_failed' => 'User search failed.',
'search_name_required' => 'Please enter a name to search.',
'search_keyword_required' => 'Please enter a keyword to search.',
'email_available' => 'Email is available.',
'email_unavailable' => 'Email is already in use.',
'email_required' => 'Please enter an email.',
'email_check_failed' => 'Failed to check email availability.',
'profile_success' => 'Profile information retrieved successfully.',
'profile_failed' => 'Failed to retrieve profile information.',
'language_update_success' => 'Language setting updated successfully.',
'language_update_failed' => 'Failed to update language setting.',
'invalid_language' => 'Unsupported language.',
'activity_log_success' => 'Activity log retrieved successfully.',
'activity_log_failed' => 'Failed to retrieve activity log.',
'bulk_status_updated' => ':count user(s) status updated successfully.',
'bulk_update_status_failed' => 'Failed to update user status in bulk.',
'last_admin_role_cannot_remove' => 'Cannot remove the admin role because you are the only user with the admin role in the system.',
// Avatar messages
'avatar_upload_success' => 'Profile image uploaded successfully.',
'avatar_upload_failed' => 'Failed to upload profile image.',
'avatar_delete_success' => 'Profile image deleted successfully.',
'avatar_delete_failed' => 'Failed to delete profile image.',
'avatar_not_found' => 'No profile image to delete.',
// Marketing consent messages
'marketing_consent_update_success' => 'Marketing consent settings updated successfully.',
'marketing_consent_update_failed' => 'Failed to update marketing consent settings.',
// Password verification messages
'password_verified' => 'Password verified successfully.',
'password_incorrect' => 'Password is incorrect.',
'password_verify_failed' => 'Failed to verify password.',
// Password change messages
'password_change_success' => 'Password changed successfully.',
'password_change_failed' => 'Failed to change password.',
// Withdraw messages
'withdraw_success' => 'Account withdrawal completed successfully.',
'withdraw_failed' => 'Failed to withdraw account. Please try again later.',
'withdraw_admin_forbidden' => 'Administrator account cannot be withdrawn.',
'withdraw_failed_unknown' => 'Withdrawal failed due to an unknown error.',
// Validation messages
'validation' => [
'page_integer' => 'Page number must be an integer.',
'page_min' => 'Page number must be at least 1.',
'per_page_integer' => 'Items per page must be an integer.',
'per_page_min' => 'Items per page must be at least 1.',
'per_page_max' => 'Items per page must not exceed 100.',
'search_string' => 'Search term must be a string.',
'search_max' => 'Search term must not exceed 255 characters.',
'search_field_invalid' => 'Invalid search field.',
'start_date_invalid' => 'Invalid start date format.',
'end_date_invalid' => 'Invalid end date format.',
'end_date_after_start' => 'End date must be after start date.',
'date_filter_invalid' => 'Invalid date filter.',
'sort_by_invalid' => 'Invalid sort field.',
'sort_order_invalid' => 'Invalid sort order.',
'name_required' => 'Name is required.',
'name_string' => 'Name must be a string.',
'name_max' => 'Name must not exceed 255 characters.',
'nickname_string' => 'Nickname must be a string.',
'nickname_max' => 'Nickname must not exceed 50 characters.',
'email_required' => 'Email is required.',
'email_invalid' => 'Invalid email format.',
'email_unique' => 'Email is already in use.',
'email_max' => 'Email must not exceed 255 characters.',
'password_required' => 'Password is required.',
'password_confirmed' => 'Password confirmation does not match.',
'password_min' => 'Password must be at least 8 characters.',
'current_password_required' => 'Current password is required.',
'current_password_invalid' => 'Current password is incorrect.',
'password_confirmation_required' => 'Password confirmation is required.',
'language_required' => 'Please select a language.',
'language_invalid' => 'Unsupported language.',
'country_required' => 'Please select a country.',
'country_size' => 'Country code must be exactly 2 characters.',
'country_alpha' => 'Country code must contain only letters.',
'timezone_invalid' => 'Please select a valid timezone.',
'status_invalid' => 'Invalid account status.',
'homepage_url' => 'Invalid URL format.',
'homepage_max' => 'Homepage URL must not exceed 255 characters.',
'mobile_max' => 'Mobile number must not exceed 20 characters.',
'mobile_regex' => 'Mobile number can only contain numbers, hyphens, and spaces.',
'phone_max' => 'Phone number must not exceed 20 characters.',
'phone_regex' => 'Phone number can only contain numbers, hyphens, and spaces.',
'avatar_required' => 'Please select a profile image.',
'avatar_image' => 'Profile image must be an image file.',
'avatar_mimes' => 'Profile image must be JPG, PNG, GIF, or WEBP format.',
'avatar_max' => 'Profile image must not exceed 2MB.',
'zipcode_max' => 'Zipcode must not exceed 10 characters.',
'address_max' => 'Address must not exceed 255 characters.',
'address_detail_max' => 'Address detail must not exceed 255 characters.',
'signature_max' => 'Signature must not exceed 1000 characters.',
'bio_max' => 'Bio must not exceed 5000 characters.',
'admin_memo_max' => 'Admin memo must not exceed 5000 characters.',
// Role information
'roles_required' => 'Please select at least one role.',
'roles_min' => 'Please select at least one role.',
// Multiple search filter messages
'filters_array' => 'Filters must be an array.',
'filters_max' => 'Maximum of 10 filters allowed.',
'filter_field_required' => 'Filter field is required.',
'filter_field_invalid' => 'Invalid filter field.',
'filter_value_required' => 'Filter value is required.',
'filter_value_max' => 'Filter value must not exceed 255 characters.',
'filter_operator_invalid' => 'Invalid filter operator.',
'search_name_required' => 'Please enter a name to search.',
'search_keyword_required' => 'Please enter a keyword to search.',
'exclude_user_id_uuid' => 'Exclude user ID must be a valid UUID.',
'exclude_user_id_exists' => 'The specified user does not exist.',
],
];