← Back to the Firebase Security Rules Exposure Checker

Firebase Rules Checker vs. requesting the URL by hand

Pasting a Realtime Database URL into a browser tab, or reaching for curl against the Firestore REST API, is a real and fast way to confirm the single obvious case: a root or collection that returns data with no login at all. Most developers who suspect a problem reach for this first, and it genuinely works for that case. This page is not affiliated with Google or Firebase — it names the Realtime Database and Firestore REST APIs only as the manual method anyone with the project ID could already try, not a product being compared against.

CheckBy handThis tool
Obvious open rootCatches itCatches it
Confirming exposure without pulling real dataA plain .json request returns real data — you'd read it to prove the pointUses shallow=true: key names only
Blocked path vs. genuinely empty oneBoth look empty unless you read the HTTP statusReported separately
Firestore's REST URL shape and document capEasy to get wrong or pull too muchOne document per collection, correctly formed
Several paths/collections at onceOne request at a timeAll named paths in one report
Repeatable in CIManual, point-in-timeReal exit code

When to still just check the URL

If you already suspect a specific path is wide open and just want to confirm it once, requesting the URL directly is fine — it's free and you already have the project ID. The gap this tool closes is doing that safely and completely: a shallow, values-free read of the Realtime Database, a capped read of every Firestore collection you name, a clear blocked-vs-unconfirmed distinction, and an exit code the same check can gate a deploy on next time.

Common questions

What does checking a Firebase project by hand actually show you?

Appending .json to a Realtime Database URL in a browser, or requesting the Firestore REST documents endpoint with curl, is a real, fast way to confirm the single obvious case -- a root or collection that returns data with no login at all. Anyone who knows the URL shape can do this in one request.

Where does the by-hand check fall short?

Three ways this scripted check catches and a by-hand request easily misses. (1) A plain .json request on an open Realtime Database pulls every field value under that path, not just key names -- proving the exposure this way means already doing the thing you were checking for; the shallow=true flag most people don't know to add avoids that. (2) A response of null or an empty object looks identical whether the path is genuinely empty or the rule is correctly blocking it, unless you also read the HTTP status code -- easy to skip when eyeballing a browser tab. (3) The Firestore REST endpoint's shape (documents/(default)/documents/<collection>) and its pagination field are not obvious from the console UI, so a first attempt at a manual request often gets the URL wrong before it gets an answer at all.

Why does this matter for CI, not just a one-time check?

A by-hand request is a point-in-time, manual look at one path or collection you remembered to try. Adding a new Firestore collection, or a rules change that is correct everywhere except the newest path, can reopen this exposure at any point after the last time someone thought to check. The CLI here returns a real exit code, so it can gate a deploy the same way a linter or test suite does -- catching the regression the day it ships rather than the next time someone happens to paste a URL into a browser.