Skip to main content

Remotely test for production best practices.

Project description

plain.scan

Remotely test for production best practices.

Overview

Plain Scan checks your production (or development) websites for common HTTP security misconfigurations—headers, SSL certificates, redirects, and other server-level security settings.

Unlike generic security scanners that flag everything as a potential issue, Plain Scan focuses on practical checks you should actually pay attention to. Every failure is highly actionable with specific guidance on what to fix.

Try it now: Visit plainframework.com/scan or run uvx plain-scan github.com

Audits

Security checks are organized into actionable audits. Each audit first checks if the security feature is detected on your site, then runs specific, practical checks to verify proper configuration. Results tell you exactly what's wrong and what to fix—no vague warnings or overwhelming noise.

Smart Defaults: Required vs Optional Audits

Plain Scan uses intelligent audit organization to ensure results are practical and actionable:

Required audits (will fail if missing or misconfigured):

  • CSP (Content Security Policy) - Protects against XSS attacks via content injection
  • HSTS (HTTP Strict Transport Security) - Enforces HTTPS connections
  • Content Type Options - Prevents MIME-sniffing attacks
  • Frame Options - Prevents clickjacking attacks
  • Referrer-Policy - Controls referrer information sharing
  • Redirects - Ensures proper HTTP to HTTPS redirects
  • TLS - Validates SSL certificate and connection security

Optional audits (won't fail if not present, only if misconfigured):

  • CORS (Cross-Origin Resource Sharing) - Only needed for cross-origin API endpoints

Conditional audits (automatically detected and only checked when relevant):

  • Cookies - Only checked if your site sets cookies in the response

This approach ensures you only see failures for things you should actually fix, not false positives for features you don't use. For deployment-specific exceptions (e.g., HSTS on staging), use --disable <audit> to skip specific checks.

FAQs

Can I use this against development servers?

Yes! Plain Scan can be used against development servers, but it's primarily designed to verify production configurations.

Why does the scan fail if a security header is missing?

Required headers (like CSP and HSTS) fail if missing because every production site needs them. See Audits for the complete list of required, optional, and conditional checks. Use --disable <audit> for deployment-specific exceptions.

Why does the scanner flag Google Analytics or Google Tag Manager in my CSP?

These domains (and similar CDNs) host JSONP endpoints that can be exploited to bypass CSP and execute arbitrary JavaScript, even though they appear "safe". This is based on research from Google's CSP Evaluator team. If you must use these services, consider using nonce-based or hash-based CSP instead of domain allowlisting.

Does Plain Scan enforce COOP/COEP/CORP (cross-origin isolation)?

Not yet. Most sites still do not ship the full cross-origin isolation header trio, so we treat it as optional for now. When a site opts into isolation (by sending any of those headers) the plan is to enforce them as a bundle, but we avoid failing scans for teams that do not need SharedArrayBuffer-level capabilities today. This keeps results focused on the widely adopted 80/20 baseline while leaving room to harden checks once adoption increases.

What are the scope and limitations of Plain Scan?

Plain Scan makes a single unauthenticated GET request to the provided URL. It checks what can be inferred from the HTTP response and performs a TLS socket probe. It does not:

  • Crawl additional pages or resources
  • Execute JavaScript or render in a browser
  • Follow authenticated flows

Emerging protections like cross-origin isolation headers (COOP/COEP/CORP) are currently informational and only enforced when you explicitly opt in.

Additional Resources

Security standards:

Plain Scan implements checks based on:

Complementary tools:

Plain Scan focuses on HTTP-level security checks and intentionally avoids browser rendering and JavaScript analysis. For a complete security picture, consider also using:

Installation

Web interface (no installation):

Visit plainframework.com/scan to scan any URL directly in your browser.

Command line (no installation):

uvx plain-scan github.com

This uses uvx to run plain-scan without adding it as a project dependency. You can use bare domains (which default to HTTPS) or full URLs.

As a project dependency:

pip install plain.scan

Or add to your pyproject.toml:

[project]
dependencies = [
    "plain.scan",
]

Then run scans:

plain-scan github.com

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plain_scan-0.5.0.tar.gz (30.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

plain_scan-0.5.0-py3-none-any.whl (40.4 kB view details)

Uploaded Python 3

File details

Details for the file plain_scan-0.5.0.tar.gz.

File metadata

  • Download URL: plain_scan-0.5.0.tar.gz
  • Upload date:
  • Size: 30.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for plain_scan-0.5.0.tar.gz
Algorithm Hash digest
SHA256 18aa6ebcd8491a07ac96c6f5b5502888d272435d9792a39b86c481d04856019c
MD5 0da2514169ceb95b7b94420325d9237f
BLAKE2b-256 65bb9a4aba654a46f73cc0bccd17acc9d31c90c9961ebeb8915d2f89de98e0c0

See more details on using hashes here.

File details

Details for the file plain_scan-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: plain_scan-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 40.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for plain_scan-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ffd7a2024f01a422cbc6936cd3903fa77b9a6744f4d0ba3362e7ebde90acf028
MD5 f25c64f8e5562a48807805fef2ae2848
BLAKE2b-256 e4797f29ead20cdebf03b776130520c23517746f7306a77ee1eb8db3d30c8be7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page