Why this matters
OWASP Top 10 is the canonical framework for thinking about web application security risks. It is not a checklist, exactly — it is a prioritized list of risk categories, each with multiple sub-issues. For Base44 apps, several of these risks manifest in platform-specific ways that generic OWASP guides do not address. This article maps each category to what it actually looks like on Base44, with concrete mitigations.
We use the OWASP 2021 Top 10 because it is the most widely-adopted version as of 2026 and the version most security audits and compliance frameworks reference.
A01 Broken Access Control (highest severity on Base44)
OWASP definition: Restrictions on what authenticated users are allowed to do are not properly enforced.
Base44 manifestation. The single most consequential risk on the platform. By default, Entity.list() returns every record in the entity, scoped only by entity name. There is no implicit per-user filtering. Update and delete operations also do not check ownership server-side. This means: any authenticated user can read every record, update any record by ID, and delete any record by ID, unless you have explicitly added authorization logic.
What it looks like in code:
// Vulnerable: returns every Order in the system, not just the current user's.
const orders = await base44.entities.Order.list();
// Vulnerable: client tells the server which user_id to use, server trusts it.
await base44.entities.Order.update(orderId, { status: "refunded" });
Mitigation:
- Every list call gets an explicit ownership filter:
Entity.list({ created_by: currentUser.email }). - Every update and delete goes through a backend function that re-fetches the record, verifies
record.created_by === currentUser.email, and only then allows the change. - Strip dangerous fields (role, permissions, tier) from any client-initiated update.
- Test with a fresh second account that owns nothing. Every list and read should return zero results.
- Add ESLint rules in your repo to flag any
Entity.list()call without a filter argument.
Severity if missed: Critical. Customer data exposure. This is the highest-impact category we audit for.
A02 Cryptographic Failures
OWASP definition: Sensitive data is exposed because of weak or missing cryptographic protection in transit or at rest.
Base44 manifestation. TLS in transit is handled automatically. The cryptographic failures are at rest and at the token layer.
Specific issues:
- JWTs in local storage. Base44 stores authentication tokens in
localStorage, where any in-page script can read them. Imperva's stored XSS disclosure exfiltrated tokens via this vector. The fix at the platform level is to move to httpOnly cookies; until that ships, tokens are exposed. - Entity data stored unencrypted. Base44 stores entity records in plaintext on its managed Postgres. For PII (SSN, birthdate, payment metadata, health data), this is insufficient for HIPAA, PCI Level 1, or many enterprise contracts.
- No native column-level encryption. You cannot tell Base44 "encrypt this column with a key I control."
Mitigation:
- Shorten JWT TTL to 15 minutes. Rotate on privileged actions. Refuse to render any user-supplied HTML.
- For sensitive fields, encrypt client-side or server-side with a key held in backend function environment variables. Decrypt on read in backend functions, never on the client.
- Use a third-party secrets vault (1Password Connect, AWS Secrets Manager, Doppler) for the encryption keys, not Base44's environment variable storage.
- For payment data, use Stripe Elements and never let card data touch Base44 storage.
Severity if missed: High to Critical depending on data sensitivity.
A03 Injection
OWASP definition: Untrusted data is sent to an interpreter as part of a command or query.
Base44 manifestation. Reduced but not eliminated.
What's mostly handled:
- The Base44 SDK's filter syntax doesn't expose raw SQL. Direct SQL injection against entities is not generally possible.
- HTML in entity fields, when rendered through React's default escaping, is safe.
What is still an issue:
- HTML rendered as
dangerouslySetInnerHTML. Any user-controlled field rendered without escaping is XSS-prone. The Imperva disclosure was exactly this in a platform-controlled view. - Markdown rendered without sanitization. If you render user-supplied markdown, the output may contain unsanitized HTML.
- Backend function code that builds external API queries from user input. A backend function that calls an external service with user-controlled query parameters can be injection-vulnerable to that service.
- LLM prompt injection. User-controlled text passed to
invokeLLMcan hijack the prompt and exfiltrate data or trigger unintended actions.
Mitigation:
- Never use
dangerouslySetInnerHTMLwith user content. If you must, run through DOMPurify with an allow-list. - For markdown, use a renderer with
html: false(markdown-it) or similar. - Validate and sanitize every user input that flows into an external API call from a backend function.
- For LLM prompts, structure user input as data, not as instructions:
prompt = "Process this user-supplied text: <text>" + escaped(userText). Use system prompts to constrain behavior. Treat LLM output as untrusted.
Severity if missed: Critical for auth-token-leaking XSS, lower for prompt injection (depends on what the LLM can do).
A04 Insecure Design
OWASP definition: Risks related to design and architectural flaws, with a focus on threat modeling, secure design patterns, and reference architectures.
Base44 manifestation. The platform's default trust model is the design issue.
Specific issues:
- Default-permissive entities. Designing for permissive defaults is a deliberate platform choice for prototyping speed, but it shifts every secure-design responsibility to the engineer.
- No threat modeling at the platform level. Apps inherit the platform's threat model assumptions, which are oriented toward indie prototyping, not production.
- AI agent emits insecure-by-default code. The agent's training data biases toward generated code that compiles and looks plausible, not toward code that is secure under hostile conditions.
Mitigation:
- Run a threat model on every app before launch. Who are your users, who are your adversaries, what are you protecting?
- Treat agent-generated code as a draft. Review every security-relevant change.
- Build security-by-default helpers and use them everywhere:
safeList(entityName, filter)instead ofEntity.list(), with the helper enforcing ownership filters. - Document the threat model in the repo. Make it part of the onboarding for new contributors.
Severity if missed: Variable. Insecure design enables every other risk; bad design plus good implementation still produces vulnerabilities.
A05 Security Misconfiguration
OWASP definition: Insecure default configurations, incomplete configurations, open cloud storage, misconfigured HTTP headers.
Base44 manifestation. Pervasive. The platform ships with many permissive defaults that are appropriate for prototyping and wrong for production.
Specific issues:
- No HSTS header. The platform doesn't add
Strict-Transport-Security. Add via CDN proxy. - No strict CSP. No way to configure
Content-Security-Policynatively. - No
X-Frame-Optionsorframe-ancestors. Clickjacking-vulnerable by default. - Verbose error messages. Default error responses leak implementation details.
- Default visibility on entities. Already covered as A01.
- Verbose stack traces in development that may persist into production.
- No rate limiting on registration or password reset.
Mitigation:
- Put Cloudflare or a similar CDN in front of your custom domain. Add HSTS, CSP, X-Frame-Options, Referrer-Policy, Permissions-Policy.
- Wrap every backend function in a try/catch that returns a generic 500 to clients while logging detail externally.
- Add explicit rate limiting on registration, password reset, and login endpoints.
- Run a security headers scan (securityheaders.com, mozilla observatory) at least monthly.
Severity if missed: High.
A06 Vulnerable and Outdated Components
OWASP definition: Use of components with known vulnerabilities.
Base44 manifestation. You don't directly manage React, Deno runtime, or platform infrastructure versions. You do manage your package.json dependencies (if you use any) and the npm/JSR packages your backend functions import.
Specific issues:
- You can't audit the platform's component versions. What version of React, what version of the Deno runtime, what version of the underlying database? Not published in detail.
- Backend function imports are user-managed. Any vulnerable npm package you import is on you.
- Front-end dependencies the agent adds. The agent sometimes pulls in npm packages with known issues.
Mitigation:
- Keep your
package.jsondependencies current. Runnpm auditweekly. - Pin backend function imports to specific versions. Audit them quarterly.
- Subscribe to Base44's changelog and security advisories (such as they are).
- Have a documented procedure for responding to a CVE in a platform-managed component (which is "wait for the platform to patch and verify").
Severity if missed: Medium to High.
A07 Identification and Authentication Failures
OWASP definition: Confirmation of user identity, authentication, or session management is implemented incorrectly.
Base44 manifestation. The July 2025 SSO bypass was a textbook A07 failure. The class of issue persists in some defaults.
Specific issues:
- The SSO bypass. Patched, but illustrative: registration accepted any email matching an
app_idwithout checking the org's allowed domains. - Email enumeration via password reset. Default reset endpoints have leaked whether an email exists.
- No MFA enforcement at the role level. Per-user MFA is opt-in.
- Session timeout on the client only. A backend function does not by default re-validate session age.
- Password complexity rules are platform-default. May not meet your industry's standards.
Mitigation:
- After any signup, re-verify the email's domain against your allowed list in a backend function.
- Wrap the password reset flow to return a generic response regardless of email existence.
- Require MFA for any admin or privileged role. Audit weekly that admins have MFA enabled.
- Add a backend-function session-age check. Reject tokens older than your policy.
- Enforce your own password complexity rules in a backend function before allowing creates.
Severity if missed: Critical.
A08 Software and Data Integrity Failures
OWASP definition: Code and infrastructure that does not protect against integrity violations, e.g., insecure deserialization, untrusted updates.
Base44 manifestation.
- AI agent regression introduces unintended changes. The agent rewriting working code is functionally a software integrity issue: the running code no longer matches what was reviewed and approved.
- Unsigned platform updates. Base44 platform updates ship without signature verification on your side.
- Untrusted webhook payloads. Inbound webhooks from third parties are signed (Stripe, etc.), but only if you verify the signatures.
Mitigation:
- Snapshot before every agent turn. Maintain a known-good code state.
- Verify webhook signatures from every third party. Reject unsigned or mis-signed payloads.
- Lock critical-path code behind explicit prompt directives or move it to backend functions the agent rarely touches.
- Subscribe to Base44's status page and changelog. React to platform changes deliberately.
Severity if missed: Medium to High.
A09 Security Logging and Monitoring Failures
OWASP definition: Insufficient logging, detection, and response capabilities.
Base44 manifestation. Severe. Platform logs are shallow and short-retention.
Specific issues:
- No detailed audit log of admin actions. Who changed which entity schema and when is not natively logged.
- Backend function logs roll quickly. Hours to days, not months.
- No native security event correlation. Failed logins, privilege escalations, anomalous access — not aggregated or alerted on.
Mitigation:
- Ship every backend function's logs out via fetch to an external SIEM.
- Build an
AuditLogentity, populate it from every privileged backend function call. - Wire Sentry for frontend errors.
- Set up alerts for: failed-auth bursts (>5 from one IP in a minute), new admin role assignments, anomalous data access volumes, credit burn anomalies.
- Retain logs for at least 90 days. Longer if regulatory requirements apply.
Severity if missed: High. Without logging, you cannot detect or respond to incidents.
A10 Server-Side Request Forgery (SSRF)
OWASP definition: A web app fetches a remote resource without validating the user-supplied URL.
Base44 manifestation. Backend functions that take user-supplied URLs and fetch them are SSRF-vulnerable.
Specific issues:
- Image proxy backend functions. A function that fetches an image from a user-supplied URL can be coerced into hitting internal URLs.
- Webhook URL validation. If your app accepts webhook URLs from users, the URLs need validation.
- OAuth callback URLs. Insufficient validation can enable open redirect to attacker-controlled domains.
Mitigation:
- Validate user-supplied URLs against an allow-list before fetching.
- Reject
127.0.0.1,localhost,169.254.169.254(cloud metadata), and private IP ranges. - Use a separate egress proxy with deny rules rather than fetching directly.
- For OAuth, strict allow-list of callback URLs.
Severity if missed: High when present, but not always present in every app.
OWASP scoring summary
| Risk | Severity on Base44 | Most common cause |
|---|---|---|
| A01 Broken Access Control | Critical | Default-permissive entities |
| A02 Cryptographic Failures | High | JWTs in local storage, plaintext PII |
| A03 Injection | Medium-High | XSS via dangerouslySetInnerHTML or markdown |
| A04 Insecure Design | Variable | Permissive defaults at platform level |
| A05 Security Misconfiguration | High | Missing security headers |
| A06 Vulnerable Components | Medium | Unpinned backend function imports |
| A07 Identification Failures | Critical | The SSO bypass class of issue |
| A08 Software/Data Integrity | Medium | AI agent regressions, missing webhook sig validation |
| A09 Logging Failures | High | Shallow platform logs |
| A10 SSRF | Variable | URL fetches in backend functions |
Common OWASP audit mistakes on Base44
Treating SDK-mediated calls as inherently safe. They are safer than raw SQL but not free of injection risk.
Skipping the second-account test for A01. This is the single highest-leverage 30 minutes of an OWASP audit.
Ignoring A09 because "the platform has logs." The platform's logs do not satisfy A09. Ship them out.
Treating A04 as theoretical. Insecure design enables every other category. Threat-model your app.
Auditing once and never again. OWASP risks reappear with every code generation pass and every schema change. Quarterly cadence minimum.
Want us to run an OWASP audit on your Base44 app?
Our $497 production audit walks all ten OWASP categories, runs second-account tests for A01, scans headers for A05, and verifies logging coverage for A09. Delivered as a written report with severity scores per finding. Order an audit or book a free 15-minute call.
Related reading
- Base44 Security Hardening Checklist — the 32-item drill-down covering A01–A10 in concrete steps.
- Base44 Authentication Patterns — the auth-flow patterns that cover A07.
- Base44 Production Readiness Guide — the broader operational picture, of which OWASP coverage is one pillar.