結論から
AIで作ったアプリを公開する前に、自分の手でできる5分チェックの2つ目。シークレットウィンドウ(ログインしていない状態)で `あなたのアプリのURL/admin` を開いてみてください。管理画面が表示されたら、その管理画面は全員に公開されています。
この記事で伝えたいのは、この一点だけです。
- 管理画面は「リンクをどこにも置いていないから」見つからない、と思われがちです。でも URL は誰でも打てます
- ログインしていない人が
/adminを開けたなら、サーバーは「あなたは誰か」を確かめずに、全予約・全会員の一覧を返しています - 直すのはサーバー側の確認一行。「ログインしているか」「管理者か」を、管理画面のすべての処理で確かめます
- AIへの頼み方と、直ったかの確かめ方を下に書きました
動画版(約2分半)は本文の上に埋め込んであります。
① 何が起きるのか:ログインなしで、全員の予約が見えた
前回と同じ、AIで作った美容室の予約アプリ(デモ用に用意した架空のもの)で試します。
- Chrome で シークレットウィンドウ を開く(Mac:
⌘ + Shift + N、Windows:Ctrl + Shift + N)。これで「ログインしていない誰か」になれます - アドレスバーに
アプリのURL/adminと打って Enter - 表示されたのは 「管理画面 — 全予約」。3人分の氏名・メールアドレス・電話番号・メニュー・日時が、そのまま一覧で読めました
右上には「未ログイン」と出ています。つまりこの画面は、あなたのアプリを知っている人なら誰でも、ログインせずに開けます。デモでは3件ですが、あなたのアプリなら、登録された全員分です。
② なぜ起きるのか:「リンクを置いていない」は、守っていない
理由1:URLは「お願い」であって、「鍵」ではない。
トップページに管理画面へのリンクが無くても、/admin /dashboard /manage といった URL は誰でも直接打てます。試す側からすれば、よくある名前を数個打つだけです。「見つからないはず」は隠しているのではなく、「見に来ないでください」とお願いしているだけです。
理由2:サーバーが「あなたは誰か」を確かめていない。
画面(ブラウザ)が「管理画面をください」と頼むと、サーバーは中身を返します。このときサーバーが「頼んできたのはログイン中の人か」「その人は管理者か」を確かめていなければ、誰に対しても同じ一覧を返します。前回の「URLの数字を変える」と、抜けている場所は同じです。確認するのはサーバー側、それ以外の場所にいくら鍵を付けても意味がありません。
なぜAIはこう作るのか。
「管理画面を作って」と頼むと、AIは管理画面を作ります。予約の一覧、検索、削除ボタン。ちゃんと動きます。でも「この画面を誰が開けてよいか」は、依頼の文の中にありません。AIは頼まれていないことを、頼まれたことと同じ熱心さでは書きません。動作確認のときは自分がログイン中なので、抜けていても気づきにくいのです。
これは珍しい話ではありません。2026年2月、Lovable の公式ショーケースに載っていた成績閲覧アプリで、ログインしていない人には全データが見え、ログインした人はむしろ弾かれるという、確認の向きが逆になったコードが見つかりました。18,697件の利用者情報(うち4,538件は学生アカウント)に誰でも到達でき、管理者の連絡先や、一括メール送信・アカウント削除といった管理機能まで外から使えたと報告されています。作った人は一行もコードを書いていません。「動く」ことと「誰が開けるか」は、別々に確かめないと分からないのです。
③ どう直すのか:サーバー側の確認一行を、AIに頼む
直すのは、管理画面のすべての処理(一覧の表示だけでなく、削除・編集・CSV出力・メール送信も)で、「ログイン中か」「管理者か」をサーバー側で確かめる一行です。以下をそのまま AI ツール(Cursor / Claude Code / Lovable のチャットなど)に貼ってください。
「管理画面(/admin 以下のページと、管理用のAPI・削除・編集・エクスポート処理すべて)に、サーバー側で『ログイン済みか』『管理者権限を持つユーザーか』を確認する処理を入れてください。未ログインならログイン画面へ、ログイン済みでも管理者でなければ403を返してください。フロントエンド側でリンクやボタンを隠すだけの対応は不要です。管理者かどうかはユーザーのデータベース上のフラグ(is_admin など)で判定し、対象になった処理の一覧も出してください。」
Supabase を使っている場合は、管理画面が読んでいるテーブルの RLS(行レベルセキュリティ)も合わせて確認します。RLS が Disabled なら、管理画面を守っても、データベースそのものが外から読める状態です(→ Moltbook の記事)。
やってはいけない直し方
- URL を
/adminから/xyz-secret-panelに変える → 推測しにくくなるだけ。共有リンクや履歴から漏れた瞬間に同じ - トップページからリンクを消す → 理由1のとおり、何も変わらない
- 「管理者かどうか」をブラウザ側の JavaScript だけで判定する → ブラウザ側は書き換えられる。判定はサーバー側で
④ 直ったかを確かめる:同じ手順で、もう一度
「直しました」というAIの返事は、確認の代わりになりません。もう一度シークレットウィンドウで `/admin` を開いてください。
- ログイン画面に飛ばされた、または「ログインが必要です」と出た → 合格
- 一般ユーザーでログインして開いたら「403」「表示できません」 → 合格(管理者以外を弾けている)
- さっきと同じ一覧が出た → まだ直っていない
確認する URL は /admin だけではありません。AIが作りがちな管理系のパスをいくつか試してください:/admin /dashboard /manage /settings /users /export。さらに、画面だけでなく 管理用のAPI(削除・一括操作)も同じ確認が必要です。画面に「ログインが必要です」と出ても、削除ボタンが叩いていた API が素通しなら、直ったことになりません。エンジニアに頼むときは「API側も」と一言添えてください。
自分で直せないとき:エンジニアに送る一文
「シークレットウィンドウで /admin を開くと、ログインなしで全予約の一覧が表示されます。管理画面と管理用API(削除・編集・エクスポート)のすべてに、サーバー側でログイン確認と管理者権限の確認を入れてください。」
この一文で、直すべき場所が正確に伝わります。逆に「URLを変えておきました」「リンクを消しました」と返ってきたら、理由1をもう一度読んでください。直っていません。
よくある質問
そもそも管理画面のURLを、誰も知らないはずでは。
/admin は、世界中のアプリで最もよく使われる管理画面の名前です。知らない人は「知らない」のではなく、「まだ打っていない」だけです。自動で URL を巡回するプログラムは、公開直後から /admin /wp-admin /.env などを順に叩きにきます。
Lovable / Bolt / v0 で作りました。管理画面を作った覚えがありません。
「予約一覧を見たい」「ユーザーを管理したい」と頼んだ時点で、管理用のページや API が作られていることがあります。プロジェクトのページ一覧(ルート一覧)を AI に出してもらい、admin dashboard manage を含むものをシークレットウィンドウで開いてください。
ログイン画面は出るけれど、URLを直接打ったら中身が見えるのはなぜ。
「ログイン画面を表示する」と「ログインしていない人にデータを返さない」は別の処理です。前者だけ作られているパターンで、まさに②の理由2です。サーバー側で確認するよう、③のプロンプトを貼ってください。
このチェックが通れば、公開して大丈夫ですか。
これは「公開前5分チェック」の2つ目です。前回の「URLの数字を変える」、次回以降の「ログアウトして画像URLを直接開く」と合わせて、ひととおり自分で確かめたうえで、不安が残る部分だけをエンジニアに見てもらうのが、いちばん費用対効果の高い順番です。VibeCode本番化では、そのための診断も行っています。


