Independent reportPublished Oct 3, 2026All times UTC

NoCodeBackend: until Sept 25, 2026, anyone with an account could get another user's database keys — just by knowing their email address

Written by miyan, an AppSumo buyer of NoCodeBackend who found the flaw and reported it privately. I am not affiliated with NoCodeBackend or with any competitor. I tested only my own account and never accessed anyone else's data.

If you use NoCodeBackend, do these three things now

  1. Regenerate the secret key of every database you have (Database Settings → regenerate). The vendor has said it did not reset keys for users, so any key created before Sept 25, 2026 keeps working until you regenerate it.
  2. Check your data for records, changes or deletions you did not make.
  3. If your databases hold your own customers' data (names, emails, orders, anything personal), that data may have been readable by strangers. Consider telling those customers, and check what your country's privacy law requires of you. In many countries, "it may have been exposed" is already enough to trigger a duty to report or notify.

This applies to free, paid, AppSumo and direct-purchase accounts alike. As far as I can tell, the vendor has not emailed users about any of this.

1. The short version

2. Why I am publishing this

I did not want to write this page. If NoCodeBackend had simply told its users what happened — "we had a bug, it is fixed, please regenerate your keys" — my private report and their quick fix would have been the end of it, and this page would not exist.

Instead, the vendor first told me in writing that there was no issue, fixed it the same day without saying so, questioned my motives in private, offered me a $250 store coupon, and then described the problem publicly as a "minor" "edge case" while pointing readers to my refund request. Meanwhile, every key issued before Sept 25 still works, and users have not been told.

Most people who buy a no-code backend are not security specialists. They cannot judge this risk from a forum thread, and many of them store their own customers' data in it. The risk is serious enough that they deserve to know — and to be able to check the facts themselves. That is why this report includes the technical details and the evidence.

About the disclosure window: my original report gave the vendor 90 days to fix the issue before I published anything, and said I would hold publication if the vendor acknowledged the report and gave me an expected fix date. No fix date was ever given. The window existed so the issue could be fixed; the vendor has now confirmed publicly that it is fixed, so there is no longer any reason to wait. I re-checked on Oct 3, 2026 at 02:02 UTC that the fix is still in place.

3. What happened, in plain words

Imagine a hotel where any guest can walk up to the front desk and say: "I'm the guest registered as alice@example.com — may I have my room keys?" The clerk checks that you are a guest of the hotel, but never checks that you are Alice. Then the clerk hands over Alice's keys.

That is the flaw. NoCodeBackend checked that the request came from some logged-in account, but not that the email in the request belonged to that account. Because anyone can create an account for free, "being a guest" was no barrier at all.

And the "keys" were not a view of the dashboard. They were the secret API keys of each database — the same keys your app uses to read and write its data. With one of those, a stranger does not need your password or your dashboard. They can talk to your database directly.

Why "we found no unauthorized access" is not reassuring on its own

Someone who used this flaw would not leave a trace you could see. They would simply hold a working key. Only the vendor's server logs could show who asked for whose email — and only for the period those logs cover. That is why the key question is what period the audit covered, and why regenerating your keys is the only safe step on your side.

4. Technical details

This section is for readers who want to check the claims. The flaw is fixed, so none of this can be used against users today. It contains no real keys, no real database names, and nothing that identifies any other customer. Every test below was made with my own account and my own token only.

4.1 The endpoint

GET https://app.nocodebackend.com/api/databases/list?email={email}
Authorization: Bearer {a valid dashboard token}

The server required a valid token (a request without one returned 401 Unauthorized), and it required the email parameter (without it: 400 "Missing email"). But it looked up databases by the email parameter alone. It did not compare that email with the owner of the token.

4.2 What I measured (Sept 23–24, 2026)

RequestResponseWhat it shows
My token + my own email200, the metadata of all my databasesNormal use
My token + an email address that is not the token owner's200, {"list":[]}The request was accepted, not refused. The server simply searched for that email. It did not ask "is this your email?"
My token + no email400 "Missing email"The email parameter decides whose list is returned
No token401 UnauthorizedThe only check was "is the caller logged in?"

A correct server answers the second request with a refusal (403): "this token does not belong to that email". This one answered 200 and simply returned whatever that email owned — an empty list, because no databases were found under that address. The request was never refused and never questioned; it was just searched. For an address that does own databases, that same response contains each database's live secret_key (section 4.3). Whether the same request would return another customer's databases is the point taken up below.

What I did not test is whether the same request would have returned a third party's list: for the other address in the table no databases were found, so its list came back empty, and I saw no one else's data. That the same request returns another customer's databases — with their live keys — is therefore an inference, not a demonstration. It is, however, the inference the vendor itself acted on when it fixed the endpoint: the fix, in the vendor's words, "added strict caller-to-token ownership validation on the database listing endpoint so no account can ever query another user's databases" (reply to my review, Sept 28). A validation like that exists to remove exactly one thing — the missing check between the caller and the email.

4.3 What the response contained

These are the real field names. All values below are made up.

{"list":[{
  "database_name": "example_shop",
  "api_url": "00000_example_shop",
  "values": "0123456789abcdef0123456789abcdef…",
  "secret_key": "sk_live_EXAMPLEEXAMPLE00",
  "region": "us",
  "host": "203.0.113.10",
  "created_on": "2026-01-01T00:00:00.000Z",
  "created_at": "2026-01-01T12:00:00.000Z",
  "created_by": "someone@example.com",
  "owner": null,
  "total_records": 42,
  "max_records": 10000,
  "max_records_formatted": "10K",
  "is_grandfathered": false,
  "purchased_extra_rows": 0
}]}
FieldWhat it is, in plain words
secret_keyThe database's live API key. It is the key your own app uses to read, add, change and delete records. This is the field that matters most.
valuesA credential value for the database (a long random string).
host, database_nameWhere the database lives and what it is called.
created_by, total_records, …Who made it, how many records it holds, and plan limits.

4.4 Why "it needs a session, so it can't be exploited" does not hold

In private, the vendor told me: "it's not possible to do perform any actions over those databases because that requires either clerk active session or better-auth session cookie" and "your findings, though good can't exploit a single database practically" (email, Sept 25, 16:44). Three facts answer this:

  1. A session was the only thing the endpoint checked, and anyone can get one. Signing up is free. So "you need a session" means "you need an account". It does not mean "you need to be the owner". (Row 2 of the table in 4.2: my session + an email address that is not mine — accepted, 200.)
  2. The key does not need a session at all. The secret_key is used with NoCodeBackend's Data API. NoCodeBackend's own documentation says: "The secret key is passed as a bearer token in the Authorization header." The key is all the request needs: no login, no browser, no cookie.
  3. Protecting the dashboard is not the same as protecting the data. The session protects the dashboard. The key opens the data. The flaw handed out the key.

The vendor's public answer calls the endpoint a "dashboard metadata helper route" that "did not expose underlying database storage, raw database rows". That is true of the list itself: it contains no rows. But it contained the key that reads the rows.

4.5 The open database port (3306)

The server that hosts customer databases had port 3306 (the standard MariaDB/MySQL port) reachable from the whole internet. Before any login, it answered with its version: MariaDB 10.6.7.

This is not only my observation. Shodan, a public internet scanner run by a third party, recorded it on 2026-09-23 04:33:49 UTC (scan ID 390657919), two days before my report. Archived copies of that record are linked in section 9.

An open port is not a break-in by itself: the database still asks for a password. But a database that the whole internet can reach is exposed to password guessing and to any future MariaDB flaw. Common practice is to allow only the vendor's own servers. The vendor now says it has "restricted raw database port access at the network firewall level". That is the right fix.

4.6 No rate limit (at the time)

When I tested in September 2026, and as I wrote in my report to the vendor at the time, this endpoint had no rate limit: 30 requests sent at the same time all went through, with no 429 Too Many Requests. That matters because nothing stood in the way of trying many email addresses quickly. I have not tested this again, and I do not describe how to do it.

4.7 How I confirmed the fix (Sept 25)

Time (UTC)CheckResult
by 11:49Responses from /api/databases/list that I saved at the time403 Forbidden. (Only the response bodies were saved, with their file times; not the full requests.)
14:11Logged re-check with my token: once with no email, once with a made-up example.com address that cannot belong to anyoneBoth 403 Forbidden: the endpoint is now blocked for everyone, including its owner
14:11Port 3306 from three locations (check-host.net)Timeout at all three: the port is closed to the internet

NoCodeBackend's MCP gateway has its own list_databases tool. As I noted in my report to the vendor, in my tests it returned only the caller's own databases. So the right check already existed elsewhere in the product.

4.8 What I did not do

The vendor's own audit agrees on this point: it found nothing "beyond your own isolated verification on your own account".

5. Timeline

All times are UTC. Email times are taken from the message headers.

When (UTC)What happened
Sept 23, 04:33Shodan (a third-party scanner) records port 3306 open on the database server.
Sept 23–24I test my own account: my email returns my full list; an email address that is not the token's owner returns an empty list instead of a refusal — the endpoint scopes by the email alone and never checks the token's owner (section 4.2). I save the responses.
Sept 25, 09:36I send a private report to NoCodeBackend support, with steps to reproduce and suggested fixes. It gives 90 days before publication.
Sept 25, 09:45Support (signed: Simar): "Let our security team go over it and we will respond you back soon."
Sept 25, 11:07In a separate email, I ask for a refund of two add-ons I bought directly from NoCodeBackend ($1,597). See section 7.
Sept 25, 11:10Support: "We don't see a any issues for the critical vulnerabilities you reported. The architecture works as expected." The same email declines the refund.
Sept 25, by 11:49Responses I save from the endpoint show 403 (section 4.7).
Sept 25, 14:11Logged re-check: the endpoint returns 403, and port 3306 is closed (section 4.7).
Sept 25, 14:16–14:19I save public archive copies of the Shodan record (section 9).
Sept 25, 16:10I post a review on AppSumo. The same day I also post a question on AppSumo's Q&A.
Sept 25, 16:44Support: "Your only intention was to get refund somehow after using the services for 9 months. Where were you before?" It also says the findings "can't exploit a single database practically".
Sept 25, 18:35I reply with the order of events and three questions: what changed to make the endpoint return 403, what closed port 3306, and whether the exposed keys were reset.
Sept 25, 20:19Support: "I really appreciate your findings and that's genuinely impressive." It offers a $250 coupon for NoCodeBackend add-ons. My three questions are not answered. I do not accept the coupon.
Sept 28The vendor (signed: Riya) answers my Q&A question and replies to my review, publicly on AppSumo.

6. What the vendor said vs. the record

This section puts the vendor's own words next to the record from the same period. I do not add labels. Each row gives the quote, where it came from, and what the record shows.

One point first, in fairness. The vendor's Q&A answer objects to my wording that the flaw let anyone "open any other user's account". That objection is fair. The flaw handed out database keys, not dashboard logins. The accurate description is in sections 3 and 4.

#What the vendor saidWhat the record shows
1 "We don't see a any issues for the critical vulnerabilities you reported. The architecture works as expected."
Email, Sept 25, 11:10
The same day, the endpoint started returning 403 (saved responses by 11:49; logged re-check at 14:11), and port 3306 was closed by 14:11 (4.7). On Sept 28 the vendor wrote: "Replying 'we don't see any issues' while our engineering team was actively deploying the fixes was the wrong response."
2 The fix took "less than 15 minutes", which "demonstrates that this was a minor conditional routing logic fix".
Q&A answer, Sept 28
How fast a fix is made shows how simple the fix was. It does not show how much was exposed before the fix. What was exposed is in 4.3: the live key of every database.
3 "a dashboard metadata helper route. It did not expose underlying database storage, raw database rows"
Q&A answer, Sept 28
The list contained no rows. It contained the secret_key that reads, changes and deletes the rows through the Data API, with no login (4.4).
4 "within just 9 minutes of submitting your initial message, you followed up with an immediate demand for a full refund"
Q&A answer, Sept 28
"When your email arrived with a request for a full $1,500+ refund … alongside the disclosure"
Review reply, Sept 28
The report was sent at 09:36. The refund request was a separate email at 11:07, 91 minutes later, after the vendor's 09:45 acknowledgment. The 9 minutes is the time until the vendor's acknowledgment. The report mentions my purchases, to show I am a paying customer, but it does not ask for a refund.
5 "actively using the platform for over 90 days", "3 months of active production usage"
Q&A answer, Sept 28
"they had already been using the tool for more than nine months"
Vendor comment under the same answer, Sept 28
The same page gives two different figures for the same thing: about 3 months, and more than 9 months. Whatever the length, I never put production data on the platform. My account held only small test databases created while evaluating the platform, including its MCP features (section 7).
6 "well past AppSumo's 60-day refund window"
Q&A answer, Sept 28
The refund I asked the vendor for was for two add-ons bought from the vendor's own checkout, not from AppSumo. AppSumo's 60-day window is not the rule for those purchases (section 7).
7 "In response to having the out-of-policy refund declined, you chose to bring this to public forums"
Q&A answer, Sept 28
My public posts came after the vendor told me in writing that there was no issue. My Q&A question asks three things: will users be told, will they be advised to change keys, and will the records be checked. It does not contain the word "refund". My review mentions the refund request once, as one line in the timeline.
8 "I really appreciate your findings and that's genuinely impressive."
Email, Sept 25, 20:19
"We did offer the user a $250 coupon code in recognition of their work."
Q&A comment, Sept 28
Nine hours earlier, on the same day: "We don't see a any issues" (11:10). Four hours earlier: "Your only intention was to get refund somehow" (16:44).
9 "you are 100% right on our communication, and we own that." … "We should have simply said: 'Thank you for the report. You are right, and it has been patched immediately.'"
Review reply, Sept 28
On the same day, in the Q&A answer, the vendor explains my public posts as a response to the refund being declined (row 7).
10 "there was zero unauthorized access, automated scraping, or data exfiltration of any customer records or secret keys"
Q&A answer, Sept 28
The answer does not say what period the audit covered, or since when the endpoint behaved this way. The endpoint existed until Sept 25. Without the period, readers cannot tell what "zero" covers.
11 "when we asked you to provide any logs or evidence demonstrating that any customer data or records were actually compromised or accessed by third parties, you were unable to provide any."
Q&A answer, Sept 28
None of the emails I received from the vendor asks me for logs or evidence. I also never claimed that anyone else's data was taken (section 10). Server logs are held by the vendor, not by customers.
12 "forced global revocation was unnecessary"
Q&A answer, Sept 28
So keys created before Sept 25 keep working until each user regenerates them. As far as I know, users have not been told directly that they should.
13 "NoCodeBackend databases remain private, firewalled, and fully secure."
Q&A answer, Sept 28
Until Sept 25, the database port was reachable from the whole internet (4.5). The vendor's own review reply says it has since "restricted raw database port access at the network firewall level".

Every row above is the vendor's own words next to a dated record. I leave the judgment to the reader.

7. About my refund request

The vendor has made my refund request part of the public discussion, so here it is in full. Readers can weigh my motives for themselves.

The refund and the flaw are separate questions. Whether I get a refund changes nothing about what the endpoint returned. The vendor has itself confirmed the flaw by fixing it and describing the fix. This page is not an offer: I am not asking for anything in exchange for taking it down.

8. What I am asking the vendor to do

Three things. None of them is about me.

  1. Tell every user directly, by email: free, paid, AppSumo and direct-purchase accounts alike. Say that the flaw existed, what it exposed, and that keys created before Sept 25, 2026 keep working until they are regenerated.
  2. Publish what the audit covered: the time period, the log sources, and the method. For example: over the whole time the endpoint behaved this way, how many requests were made in which the email did not belong to the token's owner?
  3. Reset, or strongly urge users to regenerate, every key created before Sept 25, 2026. One-click regeneration already exists. What is missing is telling people to use it.

9. Evidence

Public, anyone can check

Kept privately

These contain my personal details, so I do not publish them. I will provide them to AppSumo or to a public authority on request.

10. What this report does not claim