Security Checker の指摘を修正するのを忘れないでくださいアプリをオンラインで公開する前に、Lovable に組み込まれている Security Checker の指摘事項には必ず対応してください。Security Checker はアプリケーションを自動的にスキャンし、セキュリティを向上させるための有益な推奨事項を提供します。
Lovable のアーキテクチャを理解する
- フロントエンド: TypeScript/React アプリケーション
- バックエンド: Supabase Edge Functions(サーバーレス関数)
- データベース: Supabase(リアルタイム機能を備えた PostgreSQL)
フロントエンドセキュリティ:クライアント側のコードは決して信頼しない
黄金律: フロントエンドコードは公開されている
- フロントエンドコードにシークレットを絶対に保存しない - APIキー、パスワード、機密性の高い設定など
- フロントエンドコードで検証処理を行わない - クライアントサイドの検証は容易に迂回される
- フロントエンドから送られてくるデータを信用しない - 必ずエッジ関数側で検証する
よくあるフロントエンドのセキュリティ上のミス
フロントエンドセキュリティの検証と強化に使えるプロンプト例
バックエンドのセキュリティ:ビジネスロジックを Edge Functions に移す
Edge Functions を API レイヤーとして扱う
- 認証と認可
- データの検証とサニタイズ
- ビジネスロジックとワークフロー
- 外部サービスとの連携
- センシティブなデータの処理
Edge Functions のベストプラクティス
Edge Functions が担当すべきこと
- ユーザーにアクションを許可する前に、必ず本人であることを検証する
- 特定の操作に対して、ユーザーが適切な権限を持っているかを確認する
- 「ログインしている」というユーザーの自己申告だけを信用しない
- すべての受け取ったデータが正しい形式になっているか確認する
- ユーザー入力から潜在的に有害な内容を取り除く
- データを処理する前に、ビジネスルールを満たしていることを確認する
- 注文処理、支払い計算、ユーザー登録などの複雑なビジネスプロセスを処理する
- 複数のデータ同士の関係を管理する
- 1 つの操作の中で複数のステップを調整する
- 決済サービス、メールサービスプロバイダー、各種 API などのサードパーティサービスに安全に接続する
- 機密性の高い APIキーや認証情報を安全に保護する
- エラーやタイムアウトを適切に処理する
- 個人情報、金融データ、その他の機密性の高い情報を処理する
- 必要に応じて暗号化などのセキュリティ対策を適用する
- セキュリティ監査のために重要なイベントを記録する
Edge Functions のセキュリティ上の利点
安全な Edge Functions 向けのプロンプト例
データベースセキュリティ: RLS はシンプルに保ち、早期から導入しよう
Lovable における Row Level Security(RLS)
Lovable アプリでよくある RLS パターン
- ユーザーは自分のプロフィール、設定、個人データにのみアクセスできる
- デフォルトのパターン: 「Users can only access their own data」
- チームメンバーは、自分が所属するチーム内で共有されているプロジェクトデータにアクセスできる
- パターン: 「Users can access data from teams they belong to」
- だれでも閲覧できる公開投稿だが、編集できるのは所有者のみ
- パターン: 「Anyone can read, only owners can modify」
- 会社の従業員は自社のデータにアクセスできる
- パターン: 「Users can access data from their organization」
Lovable アプリでの RLS の見直し
- どのテーブルで RLS が有効になっているか確認する
- 機密データのテーブルが適切に保護されていることを確認する
- 公開データのテーブルに適切な読み取りポリシーが設定されていることを確認する
- ユーザーが自分のデータだけを見られることを確認する
- 共有データに適切なユーザーだけがアクセスできることをテストする
- 公開データが全ユーザーに表示されることを確認する
- 機密データに対して RLS が有効化されていないテーブル
- 不要に多くのデータを公開してしまう、許可範囲が広すぎるポリシー
- 新しいテーブルや機能に対してポリシーが未設定であること
RLS レビューのためのプロンプト例
RLS クイックチェックリスト
- すべての機密テーブルで RLS が有効になっている
- ユーザーは自分の個人データにしかアクセスできない
- 共有データには適切なアクセス制御が設定されている
- 新しいテーブルには自動的に RLS ポリシーが適用される
- ポリシーがシンプルでわかりやすい
認証セキュリティ:ロジックはサーバー側で行う
認証ロジックは必ずサーバーで実行する
- クライアント側の認証チェックを決して信用しない - ユーザーはブラウザのコードを変更できます
- トークンはサーバーで検証する - 認証は必ずエッジ関数内で検証してください
- セッション管理はサーバー側で行う - Supabase に安全なセッション保存を任せてください
- 認証用のシークレットを決して公開しない - APIキーやトークンをフロントエンドに渡してはいけません
セキュアな認証フロー
認証に関するベストプラクティス
- リクエストを処理する前に、エッジ関数内で必ずユーザー認証を確認する
- React コンポーネントではなく、サーバー側でユーザーの権限やロールを確認する
- セッショントークンをデータベースまたは認証サービスに対して検証する
- 安全なトークンの保存には Supabase の組み込みセッション管理を使用する
- 認証状態に基づいて UI を出し分けるが、セキュリティ上の判断は決して行わない
- セッションが期限切れになったらログイン画面にリダイレクトするが、その前に必ずサーバー側で検証する
ワークスペース保護:社内アプリケーションのセキュリティ確保
社内アプリの「visibility」を「Workspace」に設定する
- プロジェクトダッシュボードで社内アプリの “Project visibility” を “Workspace” に設定する
- インターネット上に公開されていないことを確認する
- すべての社内ツールで適切な認証を利用する
- 非公開アプリケーションへのアクセスを定期的に監査する
セキュリティのベストプラクティス概要
開発ワークフロー
- 最初からセキュリティを意識する - 当初から RLS と認証を実装する
- セキュリティチェッカーを使う - 定期的に Lovable のセキュリティチェッカーを実行する
- 推奨事項に従う - すべてのセキュリティに関する提案を適用する
- 十分にテストする - セキュリティ対策が想定どおりに機能していることを確認する
- セキュリティに関する判断を文書化する - セキュリティに関する選択とその理由を記録しておく
定期的なセキュリティ監査
- エッジ関数の権限を確認する
- RLSポリシーを見直す
- シークレットが漏えい・露出していないか確認する
- 認証フローを検証する
- アクセス制御をテストする
一般的なセキュリティチェックリスト
- フロントエンドコードにシークレットを含めていない
- すべてのバリデーションをエッジ関数で実行している
- RLS ポリシーが実装され、テストされている
- セキュアな方法で認証を行っている
- 社内向けアプリが適切に保護されている
- セキュリティチェッカーを実行し、推奨事項に従っている
- 定期的にセキュリティレビューを実施している
Lovable セキュリティチェッカーの使い方
- プロジェクトのダッシュボードで セキュリティチェッカーを実行する
- すべての推奨事項を注意深く確認する
- 提案された修正を速やかに実施する
- 変更後に 再度チェッカーを実行する
- 例外がある場合は 明確な理由とともに記録する