Know the scope.
Website, code and application reviews answer different questions. Each result keeps its own evidence and limits.
Check a websitePublic website
Observable behavior without a website login.
We request supported public pages, response headers, DNS records and TLS information. A fresh browser session observes JavaScript, cookies and tracking requests before interaction. We do not sign in, submit forms or exploit findings in this review.
Each scan has request and time limits. Bot challenges, network failures and exhausted limits can leave checks unverified. If a security check cannot finish, the security assessment is provisional. Its observed score remains separate from a final grade.
Privacy and Trust show their own unverified counts. Zero findings does not mean those checks passed. A public review cannot assess private application logic, authorization, stored data or infrastructure behind the public interface.
Code & pull requests
Supported source and dependency observations, tied to the reviewed version.
Configured repository reviews inspect supported JavaScript/TypeScript source, secrets, selected configuration and npm dependencies. Analyzer availability, supported inputs and coverage belong to the review profile; unsupported stacks are not silently treated as checked.
Source is inspected without executing the submitted project. A repository review records the exact commit. Baseline comparisons distinguish new findings from previously observed and newly unobserved candidates; disappearance alone is not proof that a risk was fixed.
Repository access and the configured GitHub App are required for GitHub workflows. Suggested fixes, copyable remediation tasks and supported diffs remain review material. A proposed change, passing tests and a successful retest are separate facts; no production change is made by reading a result.
Open code review toolsAuthenticated app
A declared read-only access matrix, with explicit authorization.
The configured application profile compares expected access to declared GET/JSON resources across synthetic roles and tenants. It requires verified domain control, explicit consent and fresh, short-lived test sessions. Resources must be declared safe to read; the HTTP method alone does not establish that.
The result covers those resources, sessions, environment and any recorded commit/deployment binding. Expired or unavailable sessions cannot establish an authorization result. Missing evidence is kept visible, and revoked authorization prevents the affected review from continuing as an authorized run.
This profile performs no write operations or automated login. It is not a universal DAST engine, business-logic review or penetration test. A code review and an application retest remain separate observations even when they reference the same commit.
Configure an applicationWebsite grades
An observed grade summarizes supported public security findings. It is not a certificate of safety.
Security findings are grouped into account takeover, data exposure, email impersonation, code injection and connection interception. Severity, confidence and site features affect deductions. Related findings can increase a scenario’s risk. Confirmed sensitive exposures can cap the grade.
- A
- 90+
- B
- 80+
- C
- 70+
- D
- 60+
- F
- 0+
Advisory security hygiene contributes at most 10 points of deduction. Privacy and Trust & polish observations do not change the security grade.
Confirmed means a check observed its technical condition. Likely means interpretation depends on context. Advisory marks a recommended improvement. Privacy observations are technical signals, not a determination of legal compliance.
Public check catalog
Expand a family to read every supported public check. This catalog does not describe complete code or application coverage.
Security36 checks
- Invalid TLS certificate
- Checks that the certificate is trusted, unexpired and issued for the scanned domain.
- TLS certificate expires soon
- Flags certificates that expire within 14 days.
- Outdated TLS versions enabled
- Checks whether the server still accepts TLS 1.0 or 1.1.
- HTTP does not redirect to HTTPS
- Requests the site over plain HTTP and checks that it redirects to HTTPS.
- Login or payment form sent over HTTP
- Checks that password and payment forms are served and submitted over HTTPS.
- Scripts loaded over HTTP
- Looks for scripts, iframes and stylesheets loaded over plain HTTP on an HTTPS page.
- HSTS missing or too short
- Checks the Strict-Transport-Security header (at least 180 days).
- Weak or missing Content Security Policy
- Checks for a Content-Security-Policy that blocks inline scripts. Severity rises when the page has a login.
- Clickjacking protection missing
- Checks for frame-ancestors in CSP or X-Frame-Options. Severity rises when the page has a login.
- X-Content-Type-Options missing
- Checks for X-Content-Type-Options: nosniff.
- Referrer-Policy missing or unsafe
- Checks for a Referrer-Policy header that does not leak full URLs.
- Permissions-Policy missing
- Checks for a Permissions-Policy header.
- Server software version disclosed
- Checks whether Server or X-Powered-By headers reveal exact versions.
- Session cookie without protective flags
- Checks that cookies that look like sessions are Secure, HttpOnly and have SameSite.
- Cookies without Secure flag
- Checks that cookies set over HTTPS carry the Secure flag.
- Any website can read authenticated responses (CORS)
- Sends a request with Origin: https://scanlity-probe.example and checks whether the response allows that origin together with credentials.
- CORS allows any origin
- Checks for Access-Control-Allow-Origin: * on the main page.
- Git repository exposed
- Requests /.git/config and /.git/HEAD and checks for Git file contents.
- Environment file exposed
- Requests common .env file names and checks for KEY=value lines.
- Database dump exposed
- Requests common SQL dump file names and checks for SQL statements.
- Configuration backup exposed
- Requests common backup names of PHP configuration files and checks for credentials.
- Directory listing enabled
- Checks whether the root and common upload directories list their files.
- Source maps expose original code
- Checks whether the site's own JavaScript files have public source maps that include the original source.
- phpinfo() page exposed
- Requests common phpinfo file names and checks for the phpinfo output.
- .DS_Store file exposed
- Requests /.DS_Store and checks for the macOS Finder file header.
- Dependency manifest exposed
- Requests package.json and composer files and checks for dependency lists.
- No security.txt
- Checks for /.well-known/security.txt with a Contact field.
- JavaScript library with known vulnerabilities
- Detects library versions from file names and banners and looks them up in OSV.dev.
- Outdated WordPress
- Compares the detected WordPress version with the latest release from api.wordpress.org.
- Server software past end of life
- Detects PHP, nginx and Apache versions from headers and checks endoflife.date.
- Secret key exposed in JavaScript
- Searches the site's own JavaScript and inline scripts for secret keys with unambiguous formats. Public keys (Stripe pk_, Supabase anon, Firebase) are not reported.
- SPF missing or too permissive
- Reads the domain's SPF record and checks that it ends with ~all or -all.
- DMARC missing or not enforced
- Reads _dmarc and checks that the policy is quarantine or reject.
- MTA-STS not configured
- For domains that receive email, checks for an MTA-STS policy record.
- No CAA record
- Checks for a CAA record that limits which authorities may issue certificates.
- Subdomain can be taken over
- Finds subdomains whose CNAME points to a service that no longer hosts them, using service fingerprints from can-i-take-over-xyz.
Privacy4 checks
- Tracking before visitor interaction
- Observes known tracking requests and cookies before any interaction. This is a technical signal, not a legal verdict.
- Tracking without a recognized consent manager
- Looks for consent manager markers when tracking is observed.
- No visible privacy policy link
- Looks for a privacy policy link on the main page.
- Third-party tracker inventory
- Lists recognized tracking services seen in a fresh browser session.
Trust & polish7 checks
- No visible company or legal information
- Looks for links identifying the operator or terms of use.
- No visible way to contact the operator
- Looks for email, phone, a contact page or contact form.
- Copyright year looks out of date
- Compares the most recent copyright year with the scan date.
- Broken internal links
- Checks up to ten internal links from the main page.
- Missing page metadata
- Checks title, description, viewport, social preview and favicon.
- Social proof without a visible source
- Looks for rounded customer or team counts without a nearby source.
- Generic marketing language
- Flags three or more generic phrases or emoji in headings. This does not identify AI-generated text.
Catalog 1.2.1
Keep the limits visible.
Read the example, choose a scope or begin with a public website review.
Check a website Explore the example