codex
重要な指摘
- [Blocker] ゲームWebSocket入力に実行時バリデーションがない
backend/src/game/game.gateway.ts:62では、roomId、direction、seq をTypeScript型だけで受けています。TypeScript型は実行時には消えるため、任意の値を直接Socket.IOで送信できます。
backend/src/game/game.gateway.ts:211も同様です。
一方、rooms namespaceにはbackend/src/rooms/rooms.gateway.ts:74があります。ゲーム側にもDTOと ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true }) が必要
です。
EvalHubは「空値・不正形式・SQL injection・XSS等を試し、全入力がフロントとバックエンド双方で検証されること」を明示しています。このままでは必須の「Form Validation」がNoになる可能性が
高いです。
関連して、パスワード更新もバックエンドではbackend/src/users/dto/update-user.dto.ts:41ですが、新規登録は8〜72文字です。フロント側もロジックは8文字なのにHTML属性はfrontend/src/pages/
settings/PasswordChangeModal.tsx:80で不整合です。
- [High] 初回起動が公開済みJWT秘密鍵をそのまま使用する
fresh clone後の make はMakefile:8しますが、その値は.env.example:3です。
環境変数検証はbackend/src/env.validation.ts:11。この鍵を知る第三者は任意のユーザーIDを含むJWTを作成でき、backend/src/auth/jwt.strategy.ts:8します。
少なくともproductionでは、既知のplaceholder・短い秘密鍵を拒否するべきです。
- [High] READMEで宣言した通知モジュールは要件未達
課題の通知Minorは「すべてのcreation/update/deletion actionに対する完全な通知システム」です。しかしbackend/src/notifications/notifications.service.ts:16が扱うのは次の2種類だけです。
ルーム招待はbackend/src/notifications/notifications.service.ts:35で、再起動時にも消えます。プロフィール更新、フレンド承認・削除、アカウント削除などの通知もありません。
したがってREADMEのREADME.md:162から、このMinor 1点は除外するのが安全です。ただし他の宣言が実演で通れば、合計は18点相当なので14点ライン自体は維持できます。
- [High] 本番依存に修正版のあるHigh脆弱性が9件
npm audit --omit=dev の結果はHigh 9件、Moderate 7件でした。特に公開面に関係するものは以下です。
評価の直接的なポイント項目ではありませんが、セキュリティ説明時に突っ込まれる可能性があります。
- [High] クリーン環境でバックエンドテストが開始できない
npm ci 後、CIと同じNode 22で npm test を実行しましたが、次の設定エラーで全テストが開始前に停止します。
Module ts-jest in the transform option was not found.
is: .../backend/src
原因箇所はbackend/package.json:90です。rootDir が src なのに、workspaceルートへhoistされたtransformをJestが解決できていません。.github/workflows/backend-ci.yml:35なので再現するはず
です。
- [Medium] モバイル幅で認証画面が横にはみ出す可能性が高い
Sign inとSign upのカードがそれぞれ固定w-96、つまり384pxです。
- frontend/src/components/SignIn.tsx:50
- frontend/src/components/SignUp.tsx:81
EvalHubはデスクトップとモバイル/タブレットの2サイズで確認するよう指定しています。375px以下では横スクロールが発生し得るため、w-full max-w-96 mx-4 などにするべきです。
- [Medium] 想定内の操作失敗でもブラウザコンソールにエラーを出す
frontend/src/api/errors.ts:60は、満員ルーム、フレンド申請失敗、ready更新失敗などで console.error を出します。
EvalHubはChrome DevToolsにエラー・警告がないことを確認します。不正入力テスト中の想定内4xxはUIに表示し、consoleへerrorを出さない方が安全です。
要件別の見込み
コード上で満たしている可能性が高いもの:
- React + NestJS + PostgreSQL構成
- Prisma ORM
- Docker Composeによる単一コマンド構成
- nginx HTTPS/WSS
- bcryptによるパスワードハッシュ
- Privacy Policy / Terms of Service
- READMEの必須セクション
- Git上で5人全員のコミット
- WebSocketリアルタイム機能
- ユーザー・プロフィール・フレンド・ルームチャット
- 2〜4人ゲーム、再接続処理
- Three.jsによる3D描画
- 統計、履歴、ランキング、実績
モジュール見込みは、8 Major=16点、ORM=1点、統計・履歴=1点、通知=0点で、静的確認上は18点候補です。ただし評価シートどおり、実演できなければ各モジュールは0点です。
結論として、14点分の実装量は十分ありますが、入力検証の欠落が必須要件を直接踏んでいるため、現状のまま評価へ出すのは危険です。修正優先順位は「ゲームWebSocket DTO検証 → JWT秘密鍵拒否
→ Jest修正 → 依存更新 → 通知モジュールの宣言削除または完全実装」です。
codex
重要な指摘
backend/src/game/game.gateway.ts:62では、roomId、direction、seq をTypeScript型だけで受けています。TypeScript型は実行時には消えるため、任意の値を直接Socket.IOで送信できます。
backend/src/game/game.gateway.ts:211も同様です。
一方、rooms namespaceにはbackend/src/rooms/rooms.gateway.ts:74があります。ゲーム側にもDTOと ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true }) が必要
です。
EvalHubは「空値・不正形式・SQL injection・XSS等を試し、全入力がフロントとバックエンド双方で検証されること」を明示しています。このままでは必須の「Form Validation」がNoになる可能性が
高いです。
関連して、パスワード更新もバックエンドではbackend/src/users/dto/update-user.dto.ts:41ですが、新規登録は8〜72文字です。フロント側もロジックは8文字なのにHTML属性はfrontend/src/pages/
settings/PasswordChangeModal.tsx:80で不整合です。
fresh clone後の make はMakefile:8しますが、その値は.env.example:3です。
環境変数検証はbackend/src/env.validation.ts:11。この鍵を知る第三者は任意のユーザーIDを含むJWTを作成でき、backend/src/auth/jwt.strategy.ts:8します。
少なくともproductionでは、既知のplaceholder・短い秘密鍵を拒否するべきです。
課題の通知Minorは「すべてのcreation/update/deletion actionに対する完全な通知システム」です。しかしbackend/src/notifications/notifications.service.ts:16が扱うのは次の2種類だけです。
ルーム招待はbackend/src/notifications/notifications.service.ts:35で、再起動時にも消えます。プロフィール更新、フレンド承認・削除、アカウント削除などの通知もありません。
したがってREADMEのREADME.md:162から、このMinor 1点は除外するのが安全です。ただし他の宣言が実演で通れば、合計は18点相当なので14点ライン自体は維持できます。
npm audit --omit=dev の結果はHigh 9件、Moderate 7件でした。特に公開面に関係するものは以下です。
評価の直接的なポイント項目ではありませんが、セキュリティ説明時に突っ込まれる可能性があります。
npm ci 後、CIと同じNode 22で npm test を実行しましたが、次の設定エラーで全テストが開始前に停止します。
Module ts-jest in the transform option was not found.
is: .../backend/src
原因箇所はbackend/package.json:90です。rootDir が src なのに、workspaceルートへhoistされたtransformをJestが解決できていません。.github/workflows/backend-ci.yml:35なので再現するはず
です。
Sign inとSign upのカードがそれぞれ固定w-96、つまり384pxです。
EvalHubはデスクトップとモバイル/タブレットの2サイズで確認するよう指定しています。375px以下では横スクロールが発生し得るため、w-full max-w-96 mx-4 などにするべきです。
frontend/src/api/errors.ts:60は、満員ルーム、フレンド申請失敗、ready更新失敗などで console.error を出します。
EvalHubはChrome DevToolsにエラー・警告がないことを確認します。不正入力テスト中の想定内4xxはUIに表示し、consoleへerrorを出さない方が安全です。
要件別の見込み
コード上で満たしている可能性が高いもの:
モジュール見込みは、8 Major=16点、ORM=1点、統計・履歴=1点、通知=0点で、静的確認上は18点候補です。ただし評価シートどおり、実演できなければ各モジュールは0点です。
結論として、14点分の実装量は十分ありますが、入力検証の欠落が必須要件を直接踏んでいるため、現状のまま評価へ出すのは危険です。修正優先順位は「ゲームWebSocket DTO検証 → JWT秘密鍵拒否
→ Jest修正 → 依存更新 → 通知モジュールの宣言削除または完全実装」です。