Keep it by your keyboard
Fix cheat sheet
10 leaks, the steps that close each one, and a prompt for your AI chat. Print it or copy it.

Level 1Table left open
Play itWhat went wrong: The table's Read permission was “All Users”.
- 1Open your Dashboard.
- 2Click Data.
- 3Click the table.
- 4Click Permissions, then Edit.
- 5For personal data like orders or messages, choose Creator Only — only the person who created the record can read it.
- 6For team-only data, choose User Property Check and set User Role = Admin.
- 7If you see a “Permission risks detected” banner, click its one-click Fix.
- 8Prove it: click “Test Permissions in preview” and compare what two different people can see.
Prompt for your AI chat
Only the person who submitted an order should be able to see it.
Level 2The function is the hole
Play itWhat went wrong: A locked-down table is no protection if a backend function reads the same data and hands it to anyone who calls it.
- 1Open your Dashboard.
- 2Click Security.
- 3Click Run Security Scan.
- 4Find the issue “Anyone can run this function” and click Fix with AI on that function.
- 5The fix makes the function require a signed-in user and limits the data to that user.
- 6Warning: this can break pages shown to signed-out visitors, webhooks and external integrations. Test those, then rescan.
- 7If your app does not require login, either switch it to require login, or check the caller inside the function: a provider signature for a webhook, a shared secret for anything else.
Prompt for your AI chat
Make this backend function check that the caller is signed in, and only return bookings that belong to that user.
Level 3Secret in the browser
Play itWhat went wrong: Anything in your front-end code is sent to every visitor's browser.
- 1Remove the key from the front end.
- 2Make the third-party call from a backend function instead — the browser never sees the key.
- 3Keep the key in Base44's secrets management, where it is encrypted and only available to the backend.
- 4Treat the exposed key as leaked: generate a new one with the provider, retire the old one, and use the new key in secrets.
Prompt for your AI chat
Move this third-party API call into a backend function and store the API key in secrets, so it never appears in the front end.
Level 4Credit drain
Play itWhat went wrong: When a credit-costing feature (AI, image or email) can be called from outside the app, anyone can spend your credits — not just your users.
- 1Open your Dashboard, click Security, then Run Security Scan.
- 2Find the “Prevent unauthorized credit usage” (High) issue.
- 3Click Fix, or Resolve with AI, to move the calls into the backend so only your app can trigger them.
- 4If the scan tells you to publish your changes first, do that.
- 5Rescan to confirm the issue is gone.
Prompt for your AI chat
Move this AI call into a backend function so it cannot be triggered from outside the app, and stop it spending my credits.
Level 5A hidden button is not an admin check
Play itWhat went wrong: Hiding a button in the UI does not stop anyone calling the action behind it.
- 1Open the table in Data, then Permissions, then Edit.
- 2On Create, Update and Delete, add a User Property Check with User Role = Admin.
- 3Now only admins can perform those actions, however they are called — button or no button.
Prompt for your AI chat
Make sure only admins can create, update and delete records in this table, using a User Property Check on User Role = Admin.
Level 6A guessable id is not a lock
Play itWhat went wrong: A record id is not a password.
- 1Do not rely on the secrecy of an id.
- 2Check who is asking: use Creator Only, or Entity-User Field Comparison, so the record is only shown to the person it belongs to.
- 3Then it does not matter if someone guesses the id — they still cannot see data that is not theirs.
Prompt for your AI chat
Make sure a booking link only shows the booking to the customer who owns it, using Creator Only or an Entity-User Field Comparison.
Level 7Signed in is not allowed in
Play itWhat went wrong: Backend functions can read data as the service role, which bypasses a table's data rules: the row-level rules you set in the builder, and any field-level rules your entity schema defines.
- 1Open the backend function that reads the table.
- 2Check who is calling inside the function itself. A direct call arrives with no user attached, so the function has to look.
- 3Where you can, read as the caller so the table's rules still apply. Use the service role only when the function genuinely needs power the user does not have.
- 4If it does need the service role, filter the data to the caller's own records, or require User Role = Admin before it returns anything.
- 5Run the security scan, then test with two different accounts: each should see only their own bookings.
Prompt for your AI chat
In this backend function, read bookings as the signed-in user so the table rules apply. If it must use the service role, only return bookings created by the caller and require User Role = Admin for everything else.
Level 8The rule that matches nobody
Play itWhat went wrong: In Base44, created_by is the creator's email and created_by_id is the creator's id.
- 1Open your Dashboard, click Data, click the table, then Permissions.
- 2Edit the rule and compare like with like: created_by with the user's email, or created_by_id with the user's id.
- 3Never set Read to All Users just to make a rule work for personal data.
- 4Prove it: use “Test Permissions in preview” with two accounts. Each person should see only their own records.
- 5Remember that rules using the signed-in user never match a signed-out visitor, so a stranger gets nothing.
Prompt for your AI chat
My bookings table Read rule matches nothing. Change it so each customer can only read bookings where created_by equals their own email, and do not open the table to All Users.
Level 9Invite-only is not private
Play itWhat went wrong: Inviting collaborators controls who can edit an app.
- 1Open your app's access settings and find who can open the app.
- 2For a staff-only tool, choose Private (paid plan) or Workspace, not Public.
- 3If you still see the older “Public (login required)” option, replace it. It is deprecated.
- 4Keep your data permissions locked as well. Visibility and table rules are separate layers.
- 5Test as a signed-out visitor in a private window.
Prompt for your AI chat
Explain which app visibility setting I should use for a staff-only tool, and show me how to switch this app from Public to Private or Workspace.
BonusFraming (clickjacking)
Play itWhat went wrong: If your app can be framed, another site can layer invisible elements over it.
- 1Open your Dashboard, click Settings.
- 2Click Browser Security.
- 3Set iFrame embedding to “No websites”, or “Only websites you choose”.
- 4Turn on “Protect camera and location”.
Prompt for your AI chat
Set my app's iFrame embedding to No websites and turn on Protect camera and location.
Leak Hunt is a simulated guide. These fixes follow Base44's docs as read on 16 and 17 Oct 2026, and the security scan is the authority. Test with two accounts after every change.