Back to StackSecured
Sign in free to see your findings, then unlock the full report
Sign in free →
Security Report
https://www.bullwiser.com/
Scanned
Aug 20, 2026, 10:06 AM
33 of 33 engines ran
Security Score
80/100

Good

Findings
Medium5
Low2
Top Priorities

1.Supabase Anon/Publishable Key detected in page HTML

2.CORS wildcard (*) on non-credentialed endpoint

Security Vulnerabilities

7 issues
Medium

Unauthenticated request to "profiles" returned HTTP 200 with zero rows

Impact:This could mean RLS is correctly filtering all rows for anonymous requests (a good outcome that looks identical over the wire to a genuinely empty table), or it could mean the table is simply empty right now and would return real data once populated. This scan cannot distinguish the two cases from the response alone.

Medium

Unauthenticated request to "users" returned HTTP 200 with zero rows

Impact:This could mean RLS is correctly filtering all rows for anonymous requests (a good outcome that looks identical over the wire to a genuinely empty table), or it could mean the table is simply empty right now and would return real data once populated. This scan cannot distinguish the two cases from the response alone.

Medium

Unauthenticated request to "user_profiles" returned HTTP 200 with zero rows

Impact:This could mean RLS is correctly filtering all rows for anonymous requests (a good outcome that looks identical over the wire to a genuinely empty table), or it could mean the table is simply empty right now and would return real data once populated. This scan cannot distinguish the two cases from the response alone.

Medium

Unauthenticated request to "orders" returned HTTP 200 with zero rows

Impact:This could mean RLS is correctly filtering all rows for anonymous requests (a good outcome that looks identical over the wire to a genuinely empty table), or it could mean the table is simply empty right now and would return real data once populated. This scan cannot distinguish the two cases from the response alone.

Medium

Unauthenticated request to "payments" returned HTTP 200 with zero rows

Impact:This could mean RLS is correctly filtering all rows for anonymous requests (a good outcome that looks identical over the wire to a genuinely empty table), or it could mean the table is simply empty right now and would return real data once populated. This scan cannot distinguish the two cases from the response alone.

Info

Supabase Anon/Publishable Key detected in page HTML

Impact:A Supabase Anon/Publishable Key is visible in the HTML source. This is expected — this key is designed to be public and is safe to ship client-side by itself. It becomes a real risk only if the server-side authorization behind it (RLS policies, webhook signature checks, security rules) is missing or misconfigured — see the relevant findings below for that check.

Evidence:eyJhbGci***GJD0

Info

CORS wildcard (*) on non-credentialed endpoint

Impact:This endpoint allows cross-origin requests from any website, but does not accept credentials (cookies/auth headers), so this is the expected configuration for a public API. Only a concern if this endpoint later starts returning user-specific or authenticated data without also restricting the origin.

Evidence:OPTIONS https://www.bullwiser.com/ → Access-Control-Allow-Origin: *

Info

Long-lived JWT detected — but it's a Supabase anon/publishable key, expected by design

Impact:This token decodes to role: "anon" with a multi-year lifetime, matching Supabase's publishable API key exactly — it's meant to be public and long-lived, and grants no access on its own. Every table it can reach is gated by that table's own Row Level Security policy, not by this key's expiry. A long lifetime here is not a vulnerability. If RLS is missing or misconfigured on a table, that shows up as its own separate finding.

Info

JWT signature forgery and secret-strength testing were not performed

Impact:This scan decoded JWT header/payload structure only — it never attempted to verify, forge, or brute-force the token's signature (e.g. testing for a weak/guessable HS256 secret), since that would require sending forged tokens to live authenticated endpoints. A finding-free result above means no structural weaknesses were found, not that the signing key is confirmed strong.

Info

No ID-bearing API endpoints discovered for authorization testing

Impact:No endpoints matching a REST-style object ID pattern (e.g. /api/orders/123) were found in the page HTML or loaded JavaScript bundles. This does not mean none exist — endpoints only called after user interaction, or referenced in code not loaded on the homepage, would not be visible to this scan.

Info

RLS appears to block unauthenticated reads on "reviews"

Impact:An unauthenticated request to this table was rejected (HTTP 401), consistent with Row Level Security correctly denying anonymous access.

Info

Write-operation RLS testing (INSERT/UPDATE/DELETE) was not performed

Impact:This scan only tested unauthenticated SELECT (read) access. Testing unauthenticated INSERT, UPDATE, and DELETE was not performed because doing so safely requires a self-cleaning canary-row strategy that has not been implemented yet — attempting it without one risks writing real data into your database, which this scanner will not do.

Info

No URL-fetching endpoints discovered for SSRF testing

Impact:No endpoint paths matching common proxy/fetch/preview/screenshot/webhook naming patterns were found in the page HTML or loaded JavaScript bundles. This does not rule out SSRF — endpoints only reachable after login, or referenced in code not loaded on the homepage, are not visible to this scan.

Info

Webhook replay protection and idempotency were not tested

Impact:This scan only checked whether an invalid signature is rejected. It did not test replay attacks (resubmitting a previously valid, captured signed event) or idempotency handling (the same valid event processed twice) — both require a real, previously-captured valid signature this scanner doesn't have.

Low

Fixed: Missing Cross-Origin-Opener-Policy header

Impact:Without COOP, other windows/tabs opened by your page (or that open your page) can retain a JavaScript reference to it, enabling cross-window side-channel attacks such as Spectre-style data leaks.

Low

Fixed: Missing Cross-Origin-Resource-Policy header

Impact:Without CORP, other sites can embed your images/scripts/assets directly, which can enable data-leak techniques against browsers that support speculative side-channel attacks.

14 findings are locked. Unlock the full report to see every vulnerability, its business impact, and a copy-paste fix.

Unlock Full Report — $24.99

One-time payment · Instant access · 7-day refund guarantee

What We Tested — Security

8 of 8 clean

API Key Exposure

No API keys or secrets found in JS bundles or HTML source

Passed ✓

CORS Configuration

Cross-origin requests are properly restricted

Passed ✓

Security Headers

HSTS, CSP, X-Frame-Options and other headers are set

Passed ✓

Admin Route Exposure

No sensitive admin or debug endpoints are publicly accessible

Passed ✓

Config File Exposure

No .env or config files are publicly readable

Passed ✓

GraphQL Security

GraphQL introspection is disabled or not present

Passed ✓

Cookie Security

Session cookies have HttpOnly, Secure and SameSite attributes

Passed ✓

Injection & Active Attacks

No XSS, SQL injection, open redirect or rate-limit bypass found

Passed ✓
InfrastructureDNS · email · TLS · subdomains · dependency hygieneScore: 100/100

Issues with your domain, email, TLS, and dependency configuration

0 issues
Info

DKIM record found (selector: google)

Impact:A DKIM selector was found at this domain, indicating outbound mail is likely being signed. Full validation of signature correctness requires an actual signed message and is outside passive DNS scanning.

Info

DNSSEC does not appear to be enabled

Impact:No DS record was found for this domain. Without DNSSEC, DNS responses for this domain are not cryptographically signed, making cache-poisoning/spoofing attacks against DNS resolvers (not the app itself) theoretically easier. This is a low-severity, defense-in-depth control for most SaaS applications.

Info

Subdomain discovery was limited to common names and page-referenced hosts

Impact:This scan checked 17 candidate subdomain(s) — a common-name wordlist plus any hostnames found in the page and its scripts. It did not perform a full DNS zone transfer or certificate-transparency-log search, so subdomains not in that set and not linked anywhere on the site itself would not be found.

Infrastructure checks already passing

7 of 8 clean

SPF Record

SPF record exists and is configured

DMARC Policy

DMARC record exists with an enforcing policy

DKIM Configuration

DKIM selector found and configured

TLS / Certificate Configuration

TLS certificate and configuration look healthy

Subdomain Takeover

No dangling DNS records pointing at unclaimed services

Known CVE Vulnerabilities

No known CVEs found for your detected tech stack

Historical File Exposure

No sensitive files found archived in the Wayback Machine

AI-Code Risk (beta)Heuristic warnings from public bundle analysis — not confirmed vulnerabilities
Score: 98/100
Low

AI CODE WARNING — client-side database mutation calls detected

Impact:The client bundle calls .insert()/.update()/.delete() directly against a database table from browser JavaScript (a common Supabase/Firebase pattern AI tools generate). This is a completely normal, safe pattern *if and only if* Row Level Security (or equivalent rules) correctly restrict who can do what to which rows. It is a real vulnerability if RLS is missing, disabled, or misconfigured for the affected table.

Evidence:Client-side .insert()/.update()/.delete() call pattern found in publicly downloadable JS

Fix — copy & paste

This finding is a pointer, not a verdict — see the Supabase RLS / Firebase Security findings elsewhere in this report for the actual test of whether these calls are safely restricted. If RLS passed for the relevant tables, no action needed here.
Info

Business logic testing requires an authenticated test transaction — not run

Impact:Business-logic flaws (client-controlled pricing, negative quantities, missing ownership checks, replayable discount codes) can only be confirmed by attempting a real, authenticated transaction and observing what the server actually accepts. This scan is passive/read-only against the public site, so this category is not fully testable from here. The checks below are limited, low-confidence signals worth a manual look — not a substitute for actually testing your checkout/order flow.

Free Bonus — SEO · AEO · GEO AuditIncluded with every scan, no charge
Visibility Score: 98/100

Issues affecting how Google, ChatGPT, and Perplexity find and rank your site

1 issue
Low

Favicon is missing

Impact:Sites without favicons look unfinished in browser tabs and bookmarks. Google also displays favicons next to search results — a missing one makes your listing look less credible than competitors.

Evidence:No <link rel="icon"> or similar favicon tag found in HTML

Fix — copy & paste

Add to your <head>:
<link rel="icon" href="/favicon.ico">
Or PNG: <link rel="icon" href="/icon.png" type="image/png" sizes="32x32">

Visibility checks already passing

10 clean

Page Title (SEO)

Title tag is present and well-optimized (50–60 characters)

Meta Description

Meta description is present and the right length (120–160 characters)

Social Share (Open Graph)

Open Graph tags are set — links share with a rich preview card

H1 Heading Structure

Page has exactly one H1 tag with a clear value proposition

Image Alt Text

All images have descriptive alt text for search and accessibility

Structured Data (JSON-LD)

Structured data tells Google and AI engines what your product does

FAQ Schema (AEO)

FAQ schema is set — enables rich results and AI answer citations

Organization Schema (GEO)

Organization schema tells AI engines your business entity details

Trust Pages (About, Contact, Privacy)

About, Contact, and Privacy pages are accessible — Google and AI engines verify these

Technical SEO (robots, sitemap, canonical)

robots.txt, sitemap.xml, and canonical tags are correctly set

Scan ID: df45b895-d3b5-45d5-9246-d22f8a3f77e0 · StackSecured scans are for authorized security research only