Files
Gnuboard7/lang-packs/_bundled/g7-module-sirsoft-ecommerce-ja/backend/ja/exceptions.php
T
HeuJung 494e581973 fix(security): KVE-2026 신고 4건 조치 — 관리자 API 권한 게이트 + 금전 처리 경쟁 조건
KISA 신고 4건(KVE-2026-1886/1887/1893/1894)을 검증하고, 미수정 2건과
동종 결함 전수 조사에서 나온 결함을 함께 조치했다.

권한 게이트 (KVE-2026-1893)

- NHN KCP 관리자 주문 연동 7경로가 admin 보유 여부만 보고 세부 권한을 보지 않아,
 업무 권한 없는 관리자가 주문번호·결제정보·수령인 연락처를 조회하고 에스크로
 배송등록까지 할 수 있었다. 조회는 orders.read, 등록은 orders.update, 설정성
 경로는 settings.read 로 게이트해 다른 PG 연동과 강도를 맞췄다.
- 마케팅 채널 저장은 코어 플러그인 설정과 같은 저장소를 덮어쓰는 우회 경로라
 core.plugins.update 를 부착했다.

첨부 해시 노출 (KVE-2026-1894 잔재)

- 비밀글의 썸네일 URL 이 목록·상세 응답에 그대로 실려 첨부 해시가 노출됐다.
 이미지 서빙은 이미 차단돼 있었으나 식별값 자체가 나갔다. 첨부 목록과 같은
 게이트를 써서 값만 가리고 필드는 유지한다.

경쟁 조건 (KVE-2026-1886 + 전수 조사)

- 쿠폰 차감을 조회 후 갱신에서 조건부 UPDATE 로 바꿔 1회 제한 쿠폰의 동시
 사용을 막고, 선점당한 주문은 409 로 되돌린다.
- 라이브 병렬 재현에서 그 롤백이 동작하지 않는 것을 확인했다. Action 훅 기본값이
 큐 래핑 + afterCommit 이라 금전 처리가 호출자 커밋 뒤에 실행되고 있었다.
 쿠폰·적립금 차감/복원 5개 구독에 sync 를 선언했고, 회귀 테스트는 손 등록이
 아니라 실제 등록 경로를 태워 고정했다.
- 동시 부분취소의 취소 누적 컬럼 lost update, 적립 lot 의 read-modify-write,
 주문옵션당 적립 lot 중복 생성을 각각 행 잠금·컬럼 연산·유니크 제약으로 막았다.
 기설치본의 중복 lot 은 인덱스 생성 전에 금액을 합산해 한 줄로 통합한다.

규정·문서

- sync 판정 기준을 hooks.md 에 명문화하고 /AGENTS.md Listener 표와
 coverage manifest 에 반영했다. 같은 증상을 다시 만났을 때의 진단 경로를
 트러블슈팅 사례로 남겼다.
2026-08-22 01:19:36 +09:00

90 lines
8.4 KiB
PHP

<?php
return [
'brand_not_found' => 'ブランドが見つかりません。',
'brand_has_products' => '関連商品が:count個あるため削除できません。まず商品のブランドを変更してください。',
'category_not_found' => 'カテゴリ(ID: :category_id)が見つかりません。',
'category_has_children' => 'カテゴリ(ID: :category_id)にサブカテゴリが存在するため削除できません。',
'category_has_products' => '関連商品が:count個あるため削除できません。まず商品のカテゴリを変更してください。',
'stock_mismatch' => '商品(ID: :product_id)の在庫が一致しません。予想: :expected、実際: :actual',
'currency_setting_locked' => ':setting_type設定は商品が:product_count個存在するため変更できません。',
'unauthorized_preset_access' => 'プリセット(ID: :preset_id)へのアクセス権がありません。',
'sequence_not_found' => ':typeタイプのシーケンスが見つかりません。',
'sequence_overflow' => ':typeシーケンスが最大値(:max_value)に達しました。',
'sequence_code_duplicate' => ':typeタイプのコード:codeは既に存在します。',
'coupon_not_found' => 'クーポンが見つかりません。',
'coupon_has_issues' => '発行済みクーポンが:count件あるため削除できません。',
'label_not_found' => 'ラベルが見つかりません。',
'label_has_products' => '関連商品が:count個あるため削除できません。まず商品のラベルを変更してください。',
'operation_failed' => 'タスク処理中にエラーが発生しました。',
'cart_item_not_found' => 'カート項目が見つかりません。',
'cart_access_denied' => 'カート項目へのアクセス権がありません。',
'cart_empty' => 'カートが空です。',
'temp_order_not_found' => '一時注文情報が見つかりません。',
'option_not_found' => '商品オプションが見つかりません。',
'out_of_stock' => '品切れ商品です。',
'stock_exceeded' => '在庫が不足しています。(リクエスト: :requested個、利用可能: :available個)',
'invalid_option_for_product' => '該当商品のオプションではありません。',
'order_not_found' => '注文が見つかりません。',
'order_not_cancellable' => 'キャンセルできない注文ステータスです。',
'order_not_cancellable_detail' => '現在の注文ステータス(:current_status)ではキャンセルできません。(キャンセル可能: :allowed_statuses)',
'order_already_cancelled' => '既にキャンセルされた注文です。',
'order_already_paid' => '既に決済が完了した注文です。',
'order_option_not_found' => '注文オプションが見つかりません。',
'order_option_not_in_order' => 'この注文に属していない注文オプションです。',
'product_image_not_in_product' => 'この商品に属していない画像です。',
'order_option_already_cancelled' => '既にキャンセルされた注文オプションです。',
'order_option_already_confirmed' => '既に購入確定された注文オプションです。',
'order_option_cannot_confirm' => '現在のステータスでは購入確定できません。',
'cancel_quantity_exceeds' => 'キャンセル数量が現在数量(:max個)を超えています。',
'insufficient_stock' => '在庫が不足している商品が:count個あります。',
'payment_amount_mismatch' => '決済金額が一致しません。(予想: :expected、実際: :actual)',
'cart_unavailable' => '購入できない商品があります。',
'order_amount_changed' => '注文金額が変動しました。チェックアウトページを更新してから再度お試しください。(以前: :stored、現在: :recalculated)',
'order_calculation_validation_failed' => '注文計算検証に失敗しました。クーポン有効期限切れまたは在庫変動が発生した可能性があります。',
'cancel_option_not_found' => 'キャンセル対象の注文オプションが見つかりません。',
'cancel_option_already_cancelled' => '既にキャンセルされた注文オプションです。',
'cancel_quantity_invalid' => 'キャンセル数量が有効ではありません。',
'cancel_refund_negative' => 'この商品をキャンセルすると適用中の割引条件が変わり決済金額が増えるため、キャンセルできません。',
'pg_refund_failed' => 'PG返金処理に失敗しました。(:error)',
'unknown_currency' => 'サポートされていない通貨です: :currency',
'invalid_exchange_rate' => '無効な為替レートです: :currency',
'unsupported_payment_currency' => ':currency 通貨では決済できません。為替レートの設定をご確認ください。',
'claim_reason_not_found' => 'クレーム理由が見つかりません。',
'claim_reason_in_use' => '注文キャンセルで使用中の理由は削除できません。(使用回数: :count件)',
'shipping_type_not_found' => '配送タイプが見つかりません。',
'shipping_type_in_use' => '注文で使用中の配送タイプ(:name)は削除できません。(使用回数: :count件)',
'shipping_carrier_not_found' => '配送業者が見つかりません。',
'shipping_carrier_in_use' => '注文で使用中の配送業者は削除できません。(使用回数: :count件)',
'order_cancel_not_allowed' => '決済待ち状態の注文のみキャンセルできます。',
'unauthorized' => 'この注文へのアクセス権限がありません。',
'purchase_not_allowed' => '購入権限のない商品です。',
'order_cancel_failed' => '注文キャンセル処理に失敗しました。',
'order_estimate_refund_failed' => '返金予定金額の計算に失敗しました。',
'order_create_failed' => '注文作成に失敗しました。',
'mileage' => [
'insufficient_balance' => '利用可能なマイレージ残高が不足しています。',
'deduct_exceeds_balance' => '差し引くマイレージが残高を超えています。',
'below_min_use_amount' => '最小使用金額は:amountポイントです。',
'invalid_use_unit' => 'マイレージは:unitポイント単位で使用できます。',
'exceeds_max_use' => '最大使用限度を超えました。(使用可能な最大::amountポイント)',
'use_exceeds_balance' => '保有ポイント(:amount点)を超えて使用することはできません。',
'base_currency_rule_missing' => '基本通貨のマイレージ使用単位が設定されていないため、マイレージを使用できません。',
],
'product_unavailable' => '現在販売していない商品です。',
'min_purchase_qty_not_met' => '最小購入数量は:limit個です。(リクエスト::requested個)',
'max_purchase_qty_exceeded' => '最大購入数量は:limit個です。(リクエスト::requested個)',
'product_notice_template_not_found' => '商品情報提供告示テンプレートが見つかりません。',
'product_common_info_not_found' => '商品共通情報が見つかりません。',
'product_image_limit_exceeded' => '画像は最大 :max 枚までアップロードできます。',
'additional_option_invalid' => '選択された追加オプションが有効ではありません。',
'additional_option_required' => '必須の追加オプション(:name)を選択してください。',
'additional_option_custom_text_required' => '追加オプション(:name)の直接入力内容を入力してください。',
'coupon_issue_not_found' => 'クーポン発行履歴が見つかりません。',
'coupon_issue_not_cancellable' => '未使用状態の発行分のみキャンセルできます。',
'coupon_already_used' => 'すでに使用されたクーポンです。クーポンをご確認のうえ、再度ご注文ください。',
'country_not_shippable' => '選択された配送先国には配送できない商品です。',
'order_shipping_address_update_failed' => '配送先変更処理中にエラーが発生しました。',
'order_option_not_confirmable' => '現在の状態では購入確定できない注文オプションです。',
];