crafted by Mize ↗
Open Repository Intelligence Open Repository Intelligence
CodeLens ACTIVE
CodeLens Engine
StatusOnline
Versionv0.4
ModelClaude Sonnet
Latency—
0
GOOD
改善余地があります
ToyoTake-0214/furimap
「地図でフリマを探す」という着眼点は面白いが、画像アップロードのMIMEチェック無効・本番ローカルストレージ・テストゼロという三重苦で、フリマより先にサービスが崩壊するリスクがある。
⭐ 0 Stars
·
🍴 1 Forks
·
📝 142 Commits
·
💬 5 Issues
·
🔵 Ruby
·
Rails
🔍 重要ファイル 12 件を精査 全 224 ファイル中 AI が優先度順に選択
0
✦ 品質
0
🛡 セキュリティ
0
⚙ 保守性
📋 概要

Ruby on Rails 7.2 製のフリーマーケット情報マップアプリ。Devise認証・CarrierWave+S3画像アップロード・Geocoder住所ジオコーディングを組み合わせ、地図上でイベントを探せるWebサービス。

🎯 今すぐ直すべき3点
  1. app/uploaders/event_image_uploader.rb コメントアウトされている `content_type_allowlist` を有効化し `/image\/` を設定する。拡張子偽装(例: evil.php を evil.jpg にリネーム)によるファイルアップロード攻撃を防ぐため、MIMEタイプ検証は必須。
    ↗
  2. config/initializers/devise.rb `config.mailer_sender` を `please-change-me-at-config-initializers-devise@example.com` のままにしているため、パスワードリセットメールが迷惑メール扱いされる。実際のドメインのメールアドレスに変更し、production用の送信設定(SendGrid等)を追加する。
    ↗
  3. config/environments/production.rb `config.active_storage.service = :local` がproduction環境で設定されているが、Gemfileには `fog-aws` が含まれておりS3利用を意図している。コンテナ再起動でローカルファイルが消失するリスクがあるため、`:amazon` に変更し `config/storage.yml` のS3設定を有効化する。
    ↗
🔍 検出された問題 (7件)
🟥 Critical 📄 app/uploaders/event_image_uploader.rb
画像アップロードのMIMEタイプ検証が無効化されている
`app/uploaders/event_image_uploader.rb` の `content_type_allowlist` がコメントアウトされたままになっている。拡張子チェック(`extension_allowlist`)のみでは、攻撃者が悪意あるスクリプトファイルを `.jpg` 拡張子に偽装してアップロードできる。S3経由でも Content-Type が誤って設定されると、ブラウザがスクリプトとして実行するリスクがある。
🟥 Critical 📄 config/environments/production.rb
本番環境でファイルストレージがローカルディスクに設定されている
`config/environments/production.rb` で `config.active_storage.service = :local` が設定されている。Dockerコンテナ環境では再起動・デプロイのたびにアップロードファイルが消失する。Gemfileに `fog-aws` が含まれているにもかかわらずS3が使われておらず、本番データ損失の危険がある。
🟧 Warning 📄 config/initializers/devise.rb
Deviseのmailer_senderがデフォルトのexample.comのまま
`config/initializers/devise.rb` の `config.mailer_sender` が `please-change-me-at-config-initializers-devise@example.com` のままになっている。パスワードリセットメールが実際に送信される際、送信元ドメインが不正なため迷惑メールフィルタに引っかかり、ユーザーがパスワードリセットできなくなる可能性がある。
🟧 Warning
テストが一切存在しない
Repository Facts により tests=none(ファイル数0)が確認済み。Gemfileに `capybara` と `selenium-webdriver` が含まれているにもかかわらず、テストファイルが存在しない。認証・イベント登録・ジオコーディングなどのコア機能にリグレッションが発生しても検知できない。
🟧 Warning 📄 Gemfile
公開エンドポイントにレート制限が設定されていない
Gemfileにrack-attackなどのレート制限ライブラリが含まれておらず、Deviseのログイン・登録エンドポイントへのブルートフォース攻撃やスパム登録を防ぐ仕組みがない。Deviseのデフォルト設定のみでは不十分で、大量リクエストによるアカウント乗っ取りリスクがある。
🟨 Suggestion 📄 db/schema.rb
db/schema.rb の latitude/longitude カラムが float 型
`events` テーブルの `latitude` と `longitude` が `float` 型で定義されている。浮動小数点の精度誤差により、Geocoderの距離計算や地図ピン表示に微妙なズレが生じる可能性がある。PostgreSQLの `decimal`(精度指定付き)または `double precision` への変更を検討すべき。
🟨 Suggestion 📄 app/controllers/users/registrations_controller.rb
Users::RegistrationsController が実質的に空のボイラープレート
`app/controllers/users/registrations_controller.rb` は `after_sign_up_path_for` のみをオーバーライドしており、残りは全てコメントアウトされたボイラープレートコード(約50行)。`after_sign_up_path_for` だけであればDeviseのconcernで対応可能で、このファイルの存在意義が薄い。コメントを削除してコードを整理すべき。
✅ 良い点
  • Dockerfile がマルチステージビルド構成(build/base分離)を採用しており、node_modules を最終イメージから除去することでイメージサイズを削減し、攻撃面を最小化している。
  • Dockerfile の最終ステージで `USER 1000:1000`(非rootユーザー)でプロセスを起動しており、コンテナ侵害時の権限昇格リスクを低減している。
  • db/schema.rb で `users.email` と `users.reset_password_token` に `unique: true` インデックスが設定されており、DBレベルでの重複登録・トークン衝突を防止している。

作り切ることが第一歩。改善を続けることがエンジニアリング。

🔧 リファクタ提案
  • app/uploaders/event_image_uploader.rb に `content_type_allowlist` を追加するとともに、CarrierWave::MiniMagick を有効化してサムネイル生成(`version :thumb`)を実装し、大容量画像のそのままアップロードを防ぐ。
  • Gemfileに `rack-attack` を追加し、`config/initializers/rack_attack.rb` でDeviseの `/users/sign_in` と `/users/password` エンドポイントに対してIPベースのレート制限(例: 5回/分)を設定する。
  • db/schema.rb の `events.latitude` と `events.longitude` を `float` から `decimal, precision: 10, scale: 6` に変更するマイグレーションを作成し、Geocoderの精度を向上させる。
🔒 セキュリティ注意点
  • app/uploaders/event_image_uploader.rb の `content_type_allowlist` が無効化されており、拡張子偽装によるファイルアップロード攻撃が可能な状態。`def content_type_allowlist; /image\//; end` を追加して即時対応が必要。
  • Gemfileに `dotenv-rails` が含まれており環境変数管理の意図は見られるが、`.env.example` の存在が今回の調査範囲では確認できなかった(total_files=224のsubsetのため断定不可)。AWS_ACCESS_KEY_IDなどのfog-aws用クレデンシャルが `.env` ファイルにハードコードされていないか、`.gitignore` で `.env` が除外されているかを確認すること。
📤 PRコメント出力

このレビューをGitHub PRコメントとして貼り付けられるMarkdown形式で出力します。