NoumenonTell me what's broken

This procedure is for Supabase.

Read the base symptom guide

Supabase returns another user’s private rows

A normal Supabase client can retrieve a row whose owner is a different signed-in user.

This check is for a table exposed through Supabase’s Data API and protected by Supabase Auth. Prepare two disposable accounts and one harmless row. The SQL editor can use privileges that do not represent a browser user, so a successful query there is not proof of what a normal client can read. Keep the browser test and the policy inspection together.

Reviewed . Start with a two-minute check; repairs can take longer.

The two-minute check.

  1. Identify the table and project.

    In Chrome Network, open the request that returns the private test row. Read its destination project and table path. Match those to your Supabase dashboard before inspecting policies; similarly named projects can have different rules.

  2. Classify the client credential.

    In the project’s API key settings, identify whether the browser uses a publishable or legacy anon key. Those client keys are expected to be visible. A secret or service_role key is privileged and must not be shipped to the browser; stop and rotate it if exposed.

  3. Inspect the table’s read protection.

    Open the table’s RLS policies in the dashboard. Confirm row level security is enabled and inspect every applicable SELECT policy. For a single-owner row, compare the owner column with auth.uid(), which identifies the requesting user. Look for broad rules that permit unrelated users.

  4. Try the harmless row under both identities.

    Use the app as its owner, then sign into the second account in an incognito window and open the same test item. Inspect the actual response in that window. Record whether the owner gets the row while the other account receives no private row content.

Read the result.

WORKSAn ordinary client reads its permitted row while the unrelated account cannot retrieve it.

BROKENThe Data API returns private row content to the unrelated identity.

Causes and fixes.

Ranked in the order to investigate, not by claimed frequency.

  1. RLS is off or a read policy is too broad.

    Enable RLS on the exposed table and define the intended read permission. For private owner-only data, bind access to the authenticated owner. Review all applicable policies so a permissive rule does not leave the unwanted access in place.

  2. The client uses a privileged key.

    Revoke or rotate that key, replace browser usage with a publishable key, and move privileged work to an authorized backend. Then repeat the two-account read; key replacement alone does not establish that policies are correct.

  3. The owner field is missing or wrong.

    Repair how ownership is assigned and validate it on creation and updates. Keep SELECT, INSERT, UPDATE and DELETE decisions explicit instead of treating a successful read test as proof for all four operations.

Edge cases.

  • Workspace-shared tables need membership rules that reflect the product. Replacing those with a single-owner comparison may block legitimate collaborators.
  • A server endpoint using elevated credentials requires its own access checks. Passing the browser Data API test does not prove that endpoint is safe.

When to stop and hand it over

Stop after the first unauthorized disposable-row read. Restrict the affected operation and ask for a policy review if multiple tables, membership rules or privileged server routes are involved. Supply table names and redacted policy definitions, never the service key.

Before the next attempt.

Is seeing the anon key itself a security incident?

No. It is designed for client use. The row access rules and the identity on the request determine whether private rows are protected.

Can I test with the dashboard SQL editor only?

No. Test through the app using ordinary accounts so the request exercises the user-facing access boundary.

Related case evidence.

Notes test app / direct read BG-F-002

User B could read user A’s note by changing the requested id. The repaired test fixture passed the two-user journey. This result concerns the notes service, not a Supabase or Firebase client repair.

Official sources.

These sources document the product behavior used in this check. The diagnostic order and verdicts are Noumenon’s procedure; they are not quoted product error messages.

What's
not working?

You don't need to explain it perfectly. Tell me what you expected and what happened instead.

I'll reply personally by email.
The diagnosis is free. No commitment.

Please leave out passwords and secret keys. We can arrange a test login separately.