Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

🔐 WebVulnScan

150+ Automated Security, SEO & Performance Checks

Typing SVG


Node.jsExpressLicenseChecksZero Signup


🖼️ Preview

Sample scan output for a typical site:

┌─────────────────────────────────────────────────────────┐
│ 🔐 WebVulnScan — https://example.com │
│ Score: 74 / 100 ● 38 checks ● 312ms │
├──────────┬──────────┬──────────┬──────────┐ │
│ Critical │ High │ Medium │ Low │ │
│ 0 │ 5 │ 7 │ 4 │ │
└──────────┴──────────┴──────────┴──────────┘ │
│ │
│ ✗ HIGH Missing Content-Security-Policy │
│ ✗ HIGH Missing HSTS Header │
│ ✗ HIGH Missing X-Frame-Options │
│ ✗ MEDIUM Missing X-Content-Type-Options │
│ ✗ MEDIUM robots.txt Missing │
│ ✗ MEDIUM No Rate Limiting Detected │
│ ✓ LOW SSL Certificate Valid (365 days) │
│ ✓ LOW TLS 1.3 Active │
│ ✓ LOW Compression Enabled (br) │
│ ✓ LOW CORS: Restrictive (Good) │
└─────────────────────────────────────────────────────────┘

SSLTLSCSPHSTSCORSRateCompressionSitemap


⚡ What It Scans

CategoryChecksWhat It Catches
🔒 SSL / TLS6Certificate expiry, weak ciphers, TLS version
🛡️ Security Headers11CSP, HSTS, X-Frame, CORS, Referrer-Policy
💉 Injection15XSS, SQLi, NoSQL, SSTI, XXE, LDAP, Command
🍪 Cookies7Secure, HttpOnly, SameSite, expiry
📁 Exposed Files25.env, .git, backups, SSH keys, phpinfo
🔑 Authentication10Admin panels, JWT issues, default creds
🌐 DNS & Email10SPF, DKIM, DMARC, CAA records
🚀 Performance10Response time, compression, caching, CDN
🔍 SEO13Title, meta, canonical, OG tags, sitemap
🔐 Privacy / GDPR8Cookie consent, trackers, privacy policy
Accessibility10WCAG 2.1, ARIA, tab order, skip links
🔗 Supply Chain5SRI hashes, outdated libraries, GTM
📊 API Security5GraphQL, unauth endpoints, Swagger
🏗️ Infrastructure5HTTP redirect, dev subdomains, DNSSEC
⏱️ Rate Limiting4Burst detection, payload size

🚀 Quick Start

# Clone
git clone https://github.com/codebytaki/webvulnscan.git
cd webvulnscan
# Install
npm install
# Run
npm start

Open http://localhost:3000 — paste any URL and hit scan. That's it.

Node.js 18+ required. No API keys. No accounts. Fully offline-capable.


🖥️ API Usage

Scan programmatically via the REST endpoint:

curl -X POST http://localhost:3000/api/scan \
-H "Content-Type: application/json" \
-d '{"url": "https://yoursite.com"}'

Response shape:

{
"score": 74,
"totalChecks": 38,
"passedChecks": 22,
"failedChecks": 16,
"severityCounts": { "critical": 0, "high": 5, "medium": 7, "low": 4 },
"issues": [
{
"passed": false,
"severity": "high",
"cat": "Headers",
"title": "Missing Content-Security-Policy",
"description": "No CSP header...",
"fix": "res.setHeader('Content-Security-Policy', ...)"
}
],
"responseTime": 312,
"pageSize": 14820
}

💾 Optional: Save History with Supabase

The scanner is fully functional without an account. To enable login + scan history:

  1. Create a free project at supabase.com
  2. Run supabase-schema.sql in your Supabase SQL editor
  3. Edit public/supabase-client.js:
constSUPABASE_URL='https://your-project.supabase.co';constSUPABASE_ANON='your-anon-public-key';// public key only — never service role

Row Level Security is enforced — users only ever see their own scans.


📁 Project Structure

webvulnscan/
├── server.js ← All 150+ scan checks (Node.js / Express)
├── supabase-schema.sql ← DB schema + RLS (optional)
├── photos/ ← Screenshots for this README
├── public/
│ ├── index.html ← Landing page + inline scanner modal
│ ├── scan.html ← Full-page results view
│ ├── dashboard.html ← Scan history (requires Supabase)
│ ├── login.html ← Auth page
│ ├── app.js ← Frontend logic + result rendering
│ ├── dashboard.js ← Dashboard data loader
│ ├── supabase-client.js ← Configure your Supabase keys here
│ └── shared.css ← Global dark theme styles
└── package.json

📐 How Scoring Works

Each check returns passed: true/false with a severity weight:

SeverityWeightExample
🔴 Critical15SQL injection confirmed
🟠 High8Missing CSP header
🟡 Medium3Missing canonical tag
🔵 Low1Missing Twitter card

score = 100 − (total_penalty / max_possible_penalty × 100)

A perfect site scores 100. Real-world sites typically score 40–75.


🤝 Adding a New Check

// 1. Write your check functionasyncfunctioncheckMyThing(urlStr,body,headers){constr=[];// ... your logicr.push({passed: false,severity: 'high',// critical | high | medium | lowcat: 'Security',title: 'Short check name',description: 'What it means and why it matters.',fix: '// Optional code snippet'});returnr;}// 2. Add to the Promise.all in /api/scan// 3. Spread into allChecks

PRs are welcome.


🚢 Deploy

# Any Node.js host (Railway, Render, Fly.io, VPS)
PORT=8080 npm start
# Docker one-liner
docker run -p 3000:3000 -v $(pwd):/app -w /app node:18-alpine npm start

👤 Author

Built by MD Taki — Security Researcher · AI Developer · Bug Hunter

GitHubBug Bounty


📄 License

MIT — free to use, modify, fork, and deploy.


Built by MD Taki — Security Researcher · AI Developer · Bug Hunter

About

Free open-source website scanner — 150+ automated checks for security vulnerabilities, SEO issues, performance, privacy compliance, and accessibility. No signup required.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages