AIでアプリを作るのは最高だ——無防備なままネットに公開するまでは。そしてこれこそが道のりで最も危険な瞬間だ。AIは「ビルダーモード」では、アプリが動くことに集中し、どう攻撃されうるかには目を向けない。その結果できあがるのは、URLの数字を1つ変えるだけで誰でも他人のデータを見られる美しいアプリ、世界中のどんなサイトからでも呼び出せるAPI、防御の指示が与えられていないブラウザだ。このガイドでは、最も忘れられがちな3つの鍵——RLS、CORS、セキュリティヘッダー——を、それぞれの例え、実際のリスク、そしてAIに貼り付けて設定してもらう詳細なプロンプトとともに解説する。内部の仕組みを知る必要はない。それぞれの名前と、いつ使うかを知っていればいい。
タイミングは明確で、譲れない:アプリを公開する、または実際のユーザーに渡す直前だ。 自分のパソコンで一人でテストしている間は何も起きない。だが、アプリが他人のデータを持ってネット上に出た瞬間、これらの鍵がなければすべてを晒すことになる。そしてAIは自分からはやってくれない(動かすことを考えていて、守ることは考えていない)ので、あなたが明示的に頼む必要がある。
RLSがなければ、悪意あるユーザーはURLやリクエストのIDを1つ変えるだけで他人のデータを見られる。SupabaseやPostgreSQLを使うアプリで最もよくある脆弱性であり、最も簡単に悪用される。だからこれが鍵その1だ。
SupabaseをPostgreSQLで使っています。次のテーブルがあります:[あなたのテーブルとユーザー列を列挙、例:posts (user_id)、comments (post_id, user_id)]。 各ユーザーが自分のレコードだけを閲覧/編集/削除できるようにRow-Level Securityを設定してください。Supabaseの公式ベストプラクティスに従ってください: - すべてのテーブルでRLSを有効化する(ENABLE ROW LEVEL SECURITY)。 - SELECT、INSERT、UPDATE、DELETEごとに**別々の**ポリシーを作成する(FOR ALLは使わない)。 - パフォーマンスのために重要:ユーザー関数を (SELECT auth.uid()) のようにラップし、auth.uid() を裸で使わないこと。こうするとPostgresがクエリごとに1回だけ評価し、行ごとに評価しなくなります。 - ポリシーを authenticated ロールに限定する(TO authenticated)。public にはしない。匿名の訪問者がテーブルに触れられないようにするためです。 - ポリシーで user_metadata を**絶対に**使わない(ユーザーが改変できるため)。 - ポリシーで使う列(例:user_id)にインデックスを追加する。 - 忘れずに:UPDATE を機能させるには、SELECT のポリシーも必要です。 - SupabaseのSQL Editorにそのまま貼り付けられる完全なSQLをください。そして各ポリシーが何をするかを1行で説明してください。
auth.uid() を直接使うよう教える。だがそれだとPostgresが行ごとに1回ずつ評価してしまう——10万行のテーブルでは、5ミリ秒のクエリと5秒のクエリの差になる! 裏ワザ(Supabaseが文書化している):`(SELECT auth.uid())` と書くこと。こうすれば1回だけ評価される。だから上のプロンプトはこれを明示的に求めている。私の本番ドメイン(https://mi-app.com)と開発時の localhost だけがリクエストできるように、バックエンドのCORSを設定してください。 - 本番環境では許可オリジンに "*" を使わないこと。 - 実際に使うメソッド(例:GET、POST、PUT、DELETE)だけを許可する。 - 必要なヘッダーだけを許可する。 - 私のスタックに合わせて、それぞれをどこに置くか正確に説明してください:[あなたのフレームワーク/バックエンドを伝える]。
Access-Control-Allow-Origin: * を残すこと。ドアを開けっ放しにして「どうぞ、鍵は中に置いておきました」という看板を出すようなものだ。もしAIが「早く動かすため」にそう設定していたら、公開前に直そう。推奨されるセキュリティヘッダーを私のアプリに追加してください:Content-Security-Policy、X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Strict-Transport-Security(HSTS)、Permissions-Policy。 - それぞれが何をするかを簡単な1行で説明してください。 - 私のフレームワークにそのまま使える設定をください:[使っているものを伝える、例:Next.js、Express]。 - Content-Security-Policy は何も壊さないように report-only モードで始めて、その後どう厳しくするか教えてください。 - 結果をどう検証するか教えてください。
* は絶対にしない。Join 4,200+ builders. No credit card. Build your first app with AI in minutes.