PhishLens

Privacy

PhishLens is designed to minimize data collection.

Processed Data

Data Not Collected

PhishLens must not collect:

Storage

The extension stores short-lived cached analysis results keyed by a local hash of the URL. The backend does not persist /analyze requests. Popup feedback sent to /report is persisted only as host-level label metadata in SQLite, as described below.

The extension stores backend settings in chrome.storage.sync: backend URL, timeout, and overlay preference.

The backend uses short-lived in-memory caches for PhishTank URL lookups, TLS hostname checks, Certificate Transparency lookup metadata, and RDAP domain age lookups. These caches are process-local and are not durable storage.

Successful PhishTank results are cached for 300 seconds. Transient network errors from PhishTank are cached separately for 30 seconds to allow fast retries during brief outages without hammering the external API on every request.

Successful RDAP domain age lookups are cached for 24 hours (registration dates do not change minute to minute); transient errors are cached for 30 seconds, same pattern as PhishTank.

Diagnostics and rate-limit counters are process-local and reset when the backend restarts.

Feedback

Popup feedback is persisted to a local SQLite database (feedback.db by default, configurable via PHISHLENS_FEEDBACK_DB_PATH). The store records only the URL hostname, observed and expected risk labels, whether a note was present, a sanitized request ID for tracing, and a timestamp. Full URLs, note text, page content, form values, and credentials are never stored.

The mode banner in the popup UI explicitly lists which backend services (TLS, threat intelligence, ML) were not checked when the backend is unavailable, so users know the score is heuristic-only.

Accessibility and Dark Mode

The popup UI supports the system prefers-color-scheme: dark media query via CSS custom properties. This is a purely visual change — no additional data is collected or transmitted based on the user’s colour scheme preference.

The risk panel uses aria-live="polite" with aria-atomic="true" so screen readers announce the updated risk level and score when analysis completes. The risk level label (Safe, Suspicious, Dangerous) is rendered as visible text in addition to the colour-coded border; visible symbols marked aria-hidden="true" provide a colour-independent indicator for users with colour-vision deficiency. No user interaction data beyond what is already documented is captured by these accessibility additions.

Diagnostics

GET /diagnostics is a development endpoint. It returns aggregate counters only. It must not include submitted URLs, form values, page content, cookies, credentials, screenshots, or HTML.

Demo Threat Source

PHISHLENS_ENABLE_DEMO_THREAT_SOURCE enables a localhost-only signal for the reproducible demo page. It is disabled by default and does not represent PhishTank or any external intelligence feed.

API Keys

PhishTank keys are backend environment variables only. They must never be placed in the frontend or extension bundle.