Skip to content

codexによる評価 #233

Description

@cimura

codex

重要な指摘

  1. [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で不整合です。

  1. [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・短い秘密鍵を拒否するべきです。

  1. [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点ライン自体は維持できます。

  1. [High] 本番依存に修正版のあるHigh脆弱性が9件

npm audit --omit=dev の結果はHigh 9件、Moderate 7件でした。特に公開面に関係するものは以下です。

評価の直接的なポイント項目ではありませんが、セキュリティ説明時に突っ込まれる可能性があります。

  1. [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なので再現するはず
です。

  1. [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 などにするべきです。

  1. [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修正 → 依存更新 → 通知モジュールの宣言削除または完全実装」です。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions