In short
- A scanner judges your site from the outside, by the responses it gets: headers, cookies, versions, files. It is strongest on problems every website shares.
- A passive scan only reads what your site already sends and is fit for production. An active scan sends attacks and submits forms, so run it only on a site you own, ideally on staging.
- On apps built with AI tools, the leaks that matter sit in Supabase RLS policies, Firebase rules and keys inside the JavaScript bundle. A scan pointed at your domain tests none of them.
- A CVE matched from a version banner is a guess: distributions such as Red Hat patch old versions without changing the version number. Confirm a finding is real and reachable before you act on it.
- Broken access control, one user reading another user's records, is a logic flaw that ZAP's own documentation says active scanning will not find. Testing it takes two accounts and a comparison of what each gets back.
On this page
- What a website vulnerability scanner does
- What a scanner finds well
- What a scanner misses on apps built with Lovable, Bolt, v0 or Cursor
- Free and open-source scanners people use
- How to read a scan result
- Only scan a site you own
- A scan routine for an app built with AI tools
- Is a scan enough?
- Questions
- Sources
What a website vulnerability scanner does
A website vulnerability scanner is a program that visits your site from the outside and compares what it finds with a list of known weaknesses. It does not read your source code or your database: it judges your site by the responses it gets back.
Most scanners work in three steps. They crawl: follow links, and on modern tools also the routes your JavaScript creates, to build a map of URLs and forms. They fingerprint: guess the server, framework and library versions from response headers, file names and code. Then they match: compare each version and each response with databases of CVEs (public, numbered vulnerabilities) and known bad configurations.
The checks come in two kinds, and the difference decides where you may run them.
| Passive scan | Active scan | |
|---|---|---|
| What it sends | Normal page requests, like a visitor | Requests built to trigger a flaw: injection strings in form fields, odd paths, changed parameters |
| Example | ZAP baseline scan | ZAP full scan |
| Fit for production? | Yes. ZAP documents the baseline scan for CI pipelines and production sites | Prefer staging. On production, expect test data and load |
| Typical findings | Missing headers, cookie flags, version banners, information leaks | SQL injection, cross-site scripting, open redirects, file inclusion |
What a scanner finds well
Scanners are at their best on problems that look the same on every website. A scan finds these in minutes:
- Missing or weak security headers. No
Content-Security-Policy, noStrict-Transport-Security, pages any site can frame, aReferrer-Policythat leaks full URLs. The security headers guide gives the line to add for each. - Cookie flags. A session cookie without
Secure,HttpOnlyorSameSiteshows up in the first response. - HTTPS problems. Plain HTTP that never redirects to HTTPS, redirects in the wrong order for HSTS, certificate issues.
- Outdated software. A
Server: nginx/1.18.0header, a script file with its version in the name, an old CMS plugin. - Files that should not be public. An
.envfile, a.gitfolder, a database backup, a directory listing, source maps that publish your original code. See exposed .env files. - Malware and blocklisting. Injected scripts, defacements, a domain flagged on a blocklist.
- Classic injection, with an active scan. SQL injection and cross-site scripting in forms and URL parameters are what active scanners were built for.
What a scanner misses on apps built with Lovable, Bolt, v0 or Cursor
Apps generated by AI tools are often built differently from the sites scanners were designed for: the browser talks straight to Supabase or Firebase, at an address like your-project.supabase.co, with a public key that ships in your JavaScript. Who may read which row is decided there, by row level security (RLS) policies or Firebase security rules.
A scanner pointed at yourapp.com tests yourapp.com. On a single-page app it may find little more than an HTML shell and a script file, then report a clean result while the database answers anyone who sends the right query. With no account, it cannot tell what a stranger who signs up can do either. Five leaks a scan of your domain does not test:
| The leak | Why a generic scan misses it | How to check your own app |
|---|---|---|
| Supabase table with RLS off | The query goes to Supabase's address, not your domain. A crawler has no reason to call /rest/v1/ with your public key, and no header shows a policy. | Open Security Advisor in your Supabase dashboard: it flags tables in public with RLS disabled and overly permissive policies. Or run the query in the Supabase RLS checker. |
| Firebase rules left open | Firestore answers at Google's address. Firebase warns that with open rules, anyone who guesses your project ID can steal, modify or delete your data, and the project ID sits in your app's config. | Read your rules in the Firebase console, or paste them in the Firebase rules checker, which flags test-mode rules. |
| Server keys in the JavaScript bundle | Header and version checks do not read your minified code for keys. A pattern match, where a scanner has one, reports a string, not what the key opens. | Search your built files, or paste them in the API key leak checker. The frontend API keys guide lists which keys may stay. |
| One user reading another user's records (IDOR) | It takes two accounts and a comparison of what each one gets back. ZAP's documentation says logic flaws such as broken access control will not be found by active scanning. | Create two test accounts, open a record as the first, request the same ID as the second. The IDOR guide shows where to look. |
| AI endpoint open to anyone | A route like /api/chat that answers without a session has no CVE and no version. To a scanner it is a page that returns text. | Sign out and send a short prompt to your own AI route. If a model answers, anyone can spend your credits. See unprotected AI endpoints. |
Free and open-source scanners people use
There is no single best website vulnerability scanner. Pick by what you want to learn (your header grade, malware, injectable forms) and by where it runs: an online scanner takes a URL, a tool you run yourself fits CI and staging, and only some can log in to test pages behind sign-in. Each option below is described from its own documentation.
| Scanner | What it checks | Passive or active | Limits |
|---|---|---|---|
| Mozilla HTTP Observatory, online | Security headers and related settings, including CSP, cookies, CORS, HSTS, redirections, Referrer-Policy, Subresource Integrity and framing. Scores start at 100; the maximum is 145. | Passive: reads your responses | Mozilla's FAQ says it does not test for outdated software versions, SQL injection, vulnerable CMS plugins or password storage. |
| Sucuri SiteCheck, online | Known malware, blocklisting, defacements, website errors, out-of-date CMS and plugins. Free. | Passive: visits the site like a user | It only sees what reaches the browser, so nothing on the server side. Its disclaimer: results are not guaranteed. |
| ZAP baseline scan, open source, Docker | Spiders your site for one minute by default and reports what its passive rules find: headers, cookies, information leaks. | Passive, fit for production and CI | No attack-based checks: those are in the full scan. |
| ZAP full scan, open source, Docker | The spider, then a full active scan with ZAP's attack rules. With a context file and a user (-n, -U), it scans as a logged-in user. | Active. Real attacks, can run for a long time | Logic flaws: ZAP says broken access control will not be found by active scanning. |
| Nuclei, open source (MIT), command line | Community YAML templates, each one describing a flaw and how to detect it, across web apps, infrastructure and cloud. | Depends on the template: each describes a possible attack route, sometimes with its exploit, so treat it as active | Finds only what a template exists for. Pick templates that match your stack. |
| Pentest-Tools.com, free Light scan, online | Passive tests for up to 10 types of issues, such as outdated server software, insecure HTTP headers, weak cookie and server settings, typically in under 2 minutes. | Passive | The Deep scan (40+ tests, injection and IDOR included) and authenticated scans need a paid plan or the 7-day trial, which asks for a business email and a card. |
Credit where it is due: ZAP's baseline scan and Observatory together cover most of a header and configuration review, at no cost, and paid tiers such as Pentest-Tools' Deep scan add authenticated scans and an IDOR check.
Run a passive scan on your own site
ZAP's baseline scan is a good first scan: passive, a few minutes, and it runs anywhere Docker does. Add -j --client-spider so the crawler also finds the routes your JavaScript creates. ZAP now recommends its client spider over the older Ajax spider for modern web apps.
docker run -v "$(pwd)":/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable \
zap-baseline.py -t https://your-app.example.com \
-j --client-spider -r zap-report.htmlzap-report.html in the current folder. Exit code 0 means nothing to report, 2 means warnings only, 1 means a rule you set to FAIL matched (every alert is a warning unless your config file says otherwise).How to read a scan result
A scan report is a list of maybes. Ask three questions of each line before you fix anything, or before you relax.
Is it real? False positives
Scanners match patterns, and patterns misfire: a search box flagged for a missing anti-CSRF token, a header reported missing on a redirect page. Reproduce first: open the URL, read the actual response, confirm the header or the file is really there. Once you have judged a rule, ZAP's config file lets you set it to IGNORE, WARN or FAIL, so known noise stops coming back.
Is the version real? Banner guesses
A finding like "this server version is affected by a CVE" often rests on nothing more than the version in a header. Red Hat explains that it backports security fixes into older versions, so the number stays old while the flaw is fixed, and that tools judging only by the version number produce false positives. The reverse holds too: a server that hides its banner gets no warning at all. For your own dependencies, trust the lockfile over the banner: enter the Next.js and React versions it pins in the Next.js CVE checker.
Can a stranger reach it? Severity vs reachability
Severity says how bad a flaw would be. Reachability says whether anyone can trigger it on your site. A critical CVE in a library that never sees user input can wait behind a medium finding on your login form. A missing header is a missing safeguard, not an open door.
Then the opposite trap, a clean report. Asked whether an A+ grade means a site is secure, Mozilla's FAQ answers that there are many security considerations it cannot test. A clean scan covers only what the scanner could see.
Only scan a site you own
Run a scanner only on a site you own or have written permission to test. ZAP's documentation is blunt about active scans: they are an attack on the target, and you should not use them on applications you do not own.
Even on your own app, an active scan has side effects, because it does what one careless user would do, thousands of times:
- It creates data. It submits the forms it finds: sign-ups, contact forms, comments, checkouts. Expect junk rows in your database and emails sent through your email provider.
- It trips limits. Thousands of requests in minutes can hit rate limits, bot protection and API quotas, and get your own IP address blocked.
- It costs money. Calls to AI routes, paid APIs and serverless functions are billed. A scanner that fuzzes an open
/api/chatspends your credits.
So keep passive scans for production, run active scans on a staging copy with test data, and tag the traffic so you recognize it in your logs: ZAP's Replacer add-on can add a request header of your choice.
A scan routine for an app built with AI tools
A scanner covers the first and last lines. The rest depends on how your app stores data:
- Passive header and configuration scan on production, after each deploy that touches hosting or middleware.
- Supabase Security Advisor, or a read of your Firebase rules, after every schema change.
- Built JavaScript searched for server keys before each release.
- A two-account test on every page that loads a record by ID.
- AI routes called while signed out: they should refuse.
- An active scan on staging, with test data, after large changes.
The vibe coding security checklist goes through each item for Lovable, Bolt, v0 and Cursor apps.
Is a scan enough?
For headers, versions, exposed files and known CVEs, a regular passive scan plus an occasional active scan on staging covers a lot. For an app whose data lives in Supabase or Firebase, it is not enough, because the questions that matter are about identity: what someone signed out can read, whether user B can open user A's records. Each needs an attack, run as several identities, that either works or fails. The pentest vs vulnerability scan guide compares the two approaches.
That is the part Keybrum automates, on apps whose owner proved ownership. It tries your Supabase tables, RPC functions, storage and realtime channels and your Firebase rules, checks with two accounts whether one can read the other's records, calls AI routes without a session, and looks for secrets in the bundle and exposed .env files: more than 100 attacks in all. Each finding comes with the request that worked, your coding agent reads the fix through MCP, and plans attack again on every deploy. The automated penetration testing guide explains how that differs from a manual test.
Questions
Is there a free website vulnerability scanner?
Yes, several. ZAP is free and open source, and its baseline scan is passive and fit for production. Sucuri SiteCheck is free and looks for malware, blocklisting and outdated CMS software, and Pentest-Tools.com offers a free passive Light scan. Mozilla's HTTP Observatory grades your security headers.
What is the best website vulnerability scanner?
It depends on what you need to learn. A header grader such as Observatory is the fastest view of your headers, ZAP is a broad free scanner you can run in CI, and commercial tools add authenticated scans. For apps built with AI tools, a scan of your domain does not test your Supabase or Firebase rules, so add the database checks in this guide.
Is an online vulnerability scanner for websites safe to run on my site?
A passive scan only reads what your site already sends, so it is safe on production. An active scan sends attack requests and submits forms, so it can create junk data, send emails, trip rate limits and spend API credits. Run active scans on staging, and only on sites you own.
Can I scan a website I do not own?
Not without written permission from its owner. ZAP's documentation says active scanning is an attack and should not be used on applications you do not own. Keybrum applies the same rule: it only attacks apps whose owner proved ownership.
What is a good open source website vulnerability scanner?
Two well-known options are ZAP and Nuclei. ZAP crawls your site and runs passive or active rules, with ready-made baseline and full scans in Docker. Nuclei runs community templates, each one describing a specific flaw, and is MIT licensed.
Does a website vulnerability scanner check Supabase RLS?
A scan of your website does not, because the database answers at Supabase's address, not yours, and a header or version check cannot see a policy. Open Security Advisor in your Supabase dashboard, which flags tables in public with RLS disabled, and follow the Supabase RLS guide.
Why does my scan flag a CVE on a server I keep up to date?
The scanner probably read the version number in a header. Distributions such as Red Hat Enterprise Linux backport security fixes into older versions without moving to a new upstream version number, so version-only checks raise false positives. Check your distribution's advisory for that CVE before you act.
Sources
- 1.ZAP Baseline Scan, ZAP
- 2.ZAP Full Scan, ZAP
- 3.Active Scan, ZAP
- 4.AJAX Spider, ZAP
- 5.Replacer, ZAP
- 6.HTTP Observatory FAQ, MDN Web Docs
- 7.HTTP Observatory scoring methodology, MDN Web Docs
- 8.MDN HTTP Observatory source and tests, MDN on GitHub
- 9.Sucuri SiteCheck, Sucuri
- 10.Nuclei overview, ProjectDiscovery
- 11.Nuclei repository, ProjectDiscovery on GitHub
- 12.Website Vulnerability Scanner, Pentest-Tools.com
- 13.Backporting security fixes, Red Hat
- 14.Advisors, Supabase Docs
- 15.Fix insecure rules, Firebase Docs
- 16.Statement on CVE-2025-48757, Matt Palmer