Is Your AI-Built App Exposing Data? Here's How to Find Out
You shipped something real with an AI tool, then read something alarming about vibe-coded security. You want a straight answer: is my users' data actually reachable by strangers — and how do I find out before hiring anyone?
Most data exposure in AI-built applications comes from access rules that exist only in the interface — the app hides other people's records, but the server never checks who is asking. You can confirm or rule this out yourself in about twenty minutes with two browser windows, and a security audit turns whatever you find into a scored, prioritised fix list.
The signs show up before the incident does.
None of these proves you have the problem. Each one raises the odds — and every one of them is checkable in the twenty-minute protocol below.
- The app was never asked to be secureYour prompts described features, not access rules. If nobody wrote “users must never read each other's records”, there is no reason to assume the generated code enforces it.
- Login works, so it feels safeA working login only proves the app knows who you are. Whether it checks what you are allowed to see is a separate mechanism — the one prototypes most often skip.
- Record numbers appear in your web addressesAddresses like /invoice/1042 are normal. The question is what happens when someone changes that number to 1041 — and nobody has ever tried.
- One powerful key does everythingThe credential that runs admin features also sits behind ordinary user actions. Convenient in development; in production it means every request carries master access.
- The app has only ever been used politelyYou and your testers always followed the buttons. Security is about requests that ignore the interface entirely — and nothing has tested those yet.
One missing layer explains every symptom above.
The permission check lives in the screen — not in the server behind it.
Anyone who talks to the server directly, and a browser's built-in developer tools are enough, is never asked the question the interface asks. Whatever the screen hides, the server hands over.
This is not a defect of any one tool — it follows from how prompt-built apps come to exist, and the platform guides show how the same gap surfaces on each stack.
It isn't a bug count. It's an open door.
This failure has no partial version: if one record is reachable without permission, every record in that table is. What rests on it is not abstract — customer trust, the data-protection obligations in your contracts, and any enterprise deal or investor diligence that asks the question you have not answered yet.
If something has already gone wrong, the first-response guide covers the first hour. If nothing has — that is exactly the moment this is cheap to fix.
Run the audit yourself — tonight.
No developer, no tooling, no permission needed — this is your own app. Work through the sheet in order; if a check fails, do it once more before believing it. What you find is yours to act on, with us or without us.
Can one account read another account's data?
Run itCreate two accounts, in two different browsers or one normal plus one private window. In account A, open something only A should see and copy the web address. In the other window, logged in as account B, paste that address and load it.
What the result meansB seeing an error or its own data is a pass. B seeing A's record means authorization is not enforced on the server — the severe finding. Confirm it once more, then treat it as real.
Does changing a number in the address change whose data you see?
Run itLogged in as yourself, find any address containing an ID — /orders/1052, ?user=88 — then change the number by one and load the page.
What the result meansYour own data or an error page is a pass. Someone else's record means every row in that table is readable by anyone patient enough to count.
Are secret keys sitting in the page for anyone to read?
Run itOpen your app, right-click, choose View Page Source, and search the page for “key”, “secret” and “service”. Keys named public, publishable or anon are designed to be there; anything named secret, service or admin is not.
What the result meansA privileged key in the page source is a credential every visitor already holds. It cannot be un-leaked — it has to be revoked, reissued and moved behind the server.
Does the app still answer after you log out?
Run itTake the private address from the first check, log out completely, then paste it into the same browser and load it. Try it in a private window too, where you have never logged in.
What the result meansA login screen or an error is a pass. Seeing the data while logged out means the endpoint is public — no account is needed to read it, only the address.
Is the admin area protected, or merely unlinked?
Run itWhile logged in as an ordinary, non-admin account, try the obvious addresses: /admin, /dashboard, /settings, and any admin address you know. Repeat while logged out.
What the result meansHidden is not protected. If an ordinary account can load the admin surface, every privileged action on it is one guessed address away from public.
Each of these maps to a scored item in the production-readiness framework. A pass on all of them rules out the loudest failure class — the full audit covers what a browser can't reach, at a fixed price.
Sealed from the data layer up.
The order matters more than the effort: enforcement first, credentials second, proof third. Done in the wrong order, the work gets done twice while the exposure stays open. The same discipline runs through everything we deliver.
Get my scorecard- 01
Map what is actually reachable
Before anything changes, engineers enumerate the exposure — which tables, which endpoints, which keys — so the fix list is evidence rather than guesswork. This is the diagnostic audit, with findings in 72 hours.
- 02
Move enforcement into the data layer
Access rules go onto every table that holds user data, so a request that bypasses the interface hits the same wall the interface shows. This closes the severe findings first.
- 03
Rotate every credential that reached a browser
Any key that was ever visible to a client is treated as public: revoked, reissued, and relocated behind server-side code where visitors can never read it.
- 04
Prove the denial with tests
Every access rule gets an automated test asserting the wrong user is refused — not merely that the right one succeeds — so the next feature cannot quietly reopen the hole.
- 05
Add the tripwires
Rate limiting, session expiry and monitoring that alerts a human — so the next probe is something you read on a dashboard, not something you hear from a customer.
The framework's heaviest weights sit exactly here.
40 / 100
points of the production-readiness score sit in the categories this problem touches.
See every check and weight- 20 ptsAuthentication & access controlThe heaviest category, because it is the one failure that exposes every other user's data at once. Nothing else on this list can hurt you as fast.
- 10 ptsSecrets & configurationA leaked key is not a bug you can patch quietly — it is a credential someone else now holds. Rotation has to be routine.
- 10 ptsData protection & recoveryBackups that have never been restored are not backups. This category is mostly about proving the recovery path exists.
If your app was built by describing features to an AI tool and nobody ever wrote down who may see what, assume authorization is interface-deep until the two-browser check proves otherwise — it is a twenty-minute question with a scoped, fixable answer, not a rebuild.
The questions that follow.
QDo I need to take the app offline while this is checked or fixed?
QMy platform says it handles security. Doesn't that cover this?
QI ran the self-checks and everything passed. Am I in the clear?
QA check failed. What should I do tonight?
QCan't I just prompt the AI tool to fix its own security?
QWhat does a security audit cost, and how long does it take?
- The production-readiness framework — every check we score, with weights
- Which failures to expect from the platform that built your app
- What the audit costs, and what the rescue tier includes
- My vibe-coded app broke in production — the first-response guide
- DatabaseYour App Was Fast. Now It Crawls. Here's What's Actually Happening
- PerformanceWill Your App Survive Its First Busy Day? Find Out Before It Happens
- DeploymentOne Deploy From Disaster: Could You Put Yesterday's Version Back?
- Bugs & regressionsEvery Fix Breaks Something Else. Here's Why — and the Way Out
- All problems →
- Vibe-to-Production →
Nobody has ever regretted sending us their repository.
Handing private code to anyone is a real decision, so everything below is settled before the audit starts rather than on request.
- An NDA is signed and returned before you send a linkStep one, every time
- Access is read-only, scoped to one repository, and time-boxedRevoked on delivery
- Our copy of your code is deleted when the report landsNothing retained
- We build for clients and never launch anything that competes with themNever has happened
Send us the repository. We'll tell you what's missing.
Fixed price, 72 hours to findings, and a report you can act on with or without us. Nothing is committed until you have read it.
- Give us a call+1 (424) 283 4679Straight to an engineer, not a switchboard.Reach out
- WhatsAppStart a chatFastest if you are in a different timezone to us.Reach out
- Emailhello@indianic.comSend the repo link and anything you already suspect.Reach out
- Get my scorecardFindings in 72 hoursThe audit, scored against every check on this page.Start the audit
NDA signed before you send anything · read-only access, revoked when the report lands · our copy deleted on delivery.