Skip to content

Threat Scoring

WebDecoy uses a sophisticated deception-first scoring system to evaluate every visitor and request. This page explains exactly how scores are calculated, what each category detects, and how to interpret the results.

The Threat Score is a number from 0-100 that measures the likelihood a visitor is automated or malicious. It combines signals from 8 detection categories using weighted averages, with the strongest evidence contributing the most to the final score.

┌─────────────────────────────────────────────────────────────────┐
│ THREAT SCORING PIPELINE │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Visitor Request │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ 8 DETECTION CATEGORIES │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │Honeypot │ │ Attack │ │Fingerprint│ │Behavior │ │ │
│ │ │ 40% │ │ 25% │ │ 12% │ │ 10% │ │ │
│ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐ │ │
│ │ │ TLS │ │ IP │ │ Headers │ │ User │ │ │
│ │ │ 7% │ │ 3% │ │ 2% │ │ Agent 1%│ │ │
│ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │
│ └───────┼───────────┼───────────┼───────────┼───────────┘ │
│ │ │ │ │ │
│ └───────────┴─────┬─────┴───────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ WEIGHTED SUM │ │
│ │ = Final Score │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────┐ │
│ │ Threat Score: 0-100 │ │
│ │ + Category Classification │ │
│ │ + Confidence Percentage │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
PrincipleDescription
Deception-FirstHoneypot signals are weighted highest because legitimate users never interact with hidden traps
Weighted AveragesCategories are multiplied by their weight, not simply summed
Defense in DepthMultiple signals provide stronger evidence than any single indicator
Low False PositivesEasily-spoofed signals (User-Agent, headers) have minimal impact

The scoring calculation follows a simple three-step process:

Each detection category analyzes incoming requests and produces a score from 0-100:

Category Score = Analysis of signals within that category
(0 = no suspicious signals, 100 = maximum suspicion)

Each category score is multiplied by its weight percentage:

Weighted Score = Category Score × Weight Percentage

All weighted scores are summed to produce the final Threat Score:

Final Score = Sum of all Weighted Scores

Consider a visitor who triggered some honeypot signals and has suspicious headers:

CategoryRaw ScoreWeightWeighted Score
Honeypot Signals30× 40%= 12.0
Attack Signatures0× 25%= 0
Browser Fingerprint0× 12%= 0
Behavioral Analysis0× 10%= 0
TLS Fingerprint0× 7%= 0
IP Reputation0× 3%= 0
HTTP Headers15× 2%= 0.3
User Agent0× 1%= 0
Total:12

Result: This visitor receives a Threat Score of 12 (Minimal risk).


Categories are weighted by reliability. High-confidence signals like honeypot triggers contribute more than easily-spoofed signals like User-Agent strings.

PriorityCategoryWeightWhy This Weight
HighestHoneypot Signals40%Core deception signal - legitimate users never trigger these
HighAttack Signatures25%Active exploitation attempts are clear malicious intent
MediumBrowser Fingerprint12%Automation tools have detectable anomalies
MediumBehavioral Analysis10%Non-human patterns are reliable indicators
MediumTLS Fingerprint7%JA3/JA4 fingerprints are hard to spoof
LowIP Reputation3%High false-positive potential (VPN users)
LowHTTP Headers2%Easily spoofed by sophisticated bots
LowUser Agent1%Trivially spoofed, catches only obvious cases
Honeypot Signals ████████████████████████████████████████ 40%
Attack Signatures █████████████████████████ 25%
Browser Fingerprint ████████████ 12%
Behavioral Analysis ██████████ 10%
TLS Fingerprint ███████ 7%
IP Reputation ███ 3%
HTTP Headers ██ 2%
User Agent █ 1%
─────────────────────────────────────────
0% 25% 50% 75% 100%

Priority: Highest

Detects visitors who access hidden decoy links, fill invisible form fields, or interact with trap endpoints.

Signal TypeDescriptionScore Impact
Decoy link accessHidden link followed+60-90
Hidden field filledInvisible form field populated+50-80
Fake API endpoint hitTrap endpoint accessed+70-95
Trap path accessedHoneypot URL visited+65-90
Multiple honeypots triggeredSeveral traps hit+85-100

Why it matters: Legitimate users never see or interact with these hidden elements. A trigger here is strong evidence of automated scanning or malicious reconnaissance. This is the cornerstone of WebDecoy’s deception-first approach.


Priority: High

Identifies known attack patterns in request payloads including injection attempts and exploitation techniques.

Attack TypePattern ExamplesScore Impact
SQL Injection' OR '1'='1, UNION SELECT, ; DROP TABLE+70-90
Cross-site Scripting (XSS)<script>, javascript:, onerror=+60-85
Command Injection; cat /etc/passwd, `ls -la, `` whoami` “
Path Traversal../../../etc/passwd, ....//....//+55-75
XXE<!ENTITY xxe SYSTEM, file:///etc/+70-90
LDAP Injection)(cn=*, `)(uid=))((uid=*`
NoSQL Injection{"$gt": ""}, {"$ne": null}+60-80

Why it matters: These are direct indicators of malicious intent. These patterns are rarely seen in legitimate traffic and represent active exploitation attempts.

Example Detection:

POST /api/users/login HTTP/1.1
Content-Type: application/json
{"email": "[email protected]", "password": "' OR '1'='1' --"}
→ Attack Signature Score: 85 (SQL Injection detected)

Priority: Medium

Analyzes client-side fingerprinting data to detect headless browsers, automation tools, or spoofed environments.

SignalDetection MethodScore Impact
WebDriver detectednavigator.webdriver = true+60-80
Missing pluginsNo plugins array or empty+30-50
Canvas anomalyCanvas fingerprint doesn’t match browser+40-60
Headless browser markersChrome headless signatures+55-75
WebGL inconsistencyGPU fingerprint mismatch+35-55
Timezone mismatchBrowser timezone vs IP geolocation+25-40
Language mismatchBrowser language vs expected+20-35

Why it matters: Automation tools often have telltale fingerprint anomalies that are difficult to fake convincingly. While sophisticated bots can spoof some signals, maintaining consistent fingerprints across all dimensions is challenging.

Example Detection:

// Detected anomalies:
navigator.webdriver = true // WebDriver flag set
navigator.plugins.length = 0 // No plugins (unusual)
canvas.toDataURL() = [headless hash] // Known headless signature
Fingerprint Score: 72

Priority: Medium

Examines interaction patterns including mouse movements, keyboard input, scroll behavior, and navigation timing.

SignalWhat It DetectsScore Impact
No mouse movementZero cursor events recorded+40-60
Impossible timingActions faster than human capability+50-70
Linear navigationPerfectly straight mouse paths+35-50
Missing scroll eventsNo scrolling on long pages+25-40
Instant form submissionForm submitted in <500ms+45-65
No keyboard patternsKeys pressed without natural rhythm+30-45
Robotic click patternsClicks at exact same coordinates+40-55

Why it matters: Bots typically exhibit non-human behavior patterns—too fast, too uniform, or missing expected interactions. Real humans have micro-movements, variable timing, and natural browsing patterns that are difficult to simulate perfectly.

Example Detection:

Session Analysis:
├── Mouse events: 0 (expected: 50-200 for page complexity)
├── Time on page: 0.3s (submitted form)
├── Scroll depth: 0% (form below fold)
└── Keyboard rhythm: N/A (no typing detected)
→ Behavior Score: 68

Priority: Medium

Uses JA3/JA4 fingerprinting to identify the TLS client implementation and match against known automation tools.

TLS SignatureWhat It IndicatesScore Impact
Known bot signatureMatches scrapy, selenium, etc.+50-70
curl fingerprintRequest from curl library+45-65
Python requestsCommon in scripts/bots+40-60
Headless Chrome TLSDiffers from regular Chrome+35-55
Go HTTP clientOften used in scanners+40-55
Node.js fetchServer-side requests+30-45
Mismatched TLS/UATLS says Python, UA says Chrome+55-75

Why it matters: TLS fingerprints are hard to spoof because they’re generated at the protocol level before any application code runs. They reliably identify curl, wget, Python requests, and headless browsers even when User-Agent strings are spoofed.

JA3 Fingerprint Example:

TLS Handshake Analysis:
├── Cipher Suites: [specific order unique to client]
├── Extensions: [TLS extensions and order]
├── Curves: [supported elliptic curves]
└── Point Formats: [EC point formats]
JA3 Hash: 769,47-53-5-10-49161-49162-49171-49172...
Match: Python/requests 2.28.x
→ TLS Score: 58

Priority: Low

Checks IP addresses against threat intelligence feeds and identifies datacenter/proxy/VPN connections.

SignalSourceScore Impact
Known malicious IPThreat intelligence feeds+60-80
Datacenter hostingIP belongs to cloud provider+20-35
TOR exit nodeIP is TOR network endpoint+40-55
High abuse reportsMany reports on AbuseIPDB+35-50
Open proxyIP listed as open proxy+30-45
VPN serviceKnown VPN provider IP+15-30
Residential proxySuspicious residential IP+25-40

Why it matters: Provides useful context but has high false-positive potential. Many legitimate users use VPNs for privacy, and datacenter IPs might be corporate proxies. That’s why this category only contributes 3% to the final score.


Priority: Low

Analyzes HTTP request headers for missing standard headers or patterns associated with automated tools.

SignalWhat’s DetectedScore Impact
Missing Accept headerNo content type preference+25-40
No RefererDirect access to deep pages+15-25
Unusual header orderNon-browser header ordering+20-35
Missing cookiesNo cookie support+15-25
Missing Accept-LanguageNo language preference+20-30
Missing Accept-EncodingNo compression support+15-25

Why it matters: Simple bots often omit headers that real browsers include automatically. However, this is easily spoofed by adding the expected headers, which is why the weight is low.

Example:

GET /api/data HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0...
# Missing: Accept, Accept-Language, Accept-Encoding, Cookie
→ Header Score: 45

Priority: Low

Examines User-Agent strings for bot signatures, outdated versions, or obvious automation markers.

SignalExamplesScore Impact
Known bot string”Googlebot”, “Bingbot” (verified)0 (legitimate)
curl/wget UA”curl/7.68.0”, “Wget/1.20”+50-70
Empty User-AgentNo UA provided+60-80
Scripting library UA”python-requests”, “axios”+40-60
Outdated browserChrome 60 when current is 120+20-35
Malformed UASyntax errors or truncated+35-50

Why it matters: User-Agent is trivially spoofed by any bot, so it receives minimal weight (1%). It only catches the most obvious, unsophisticated bots that don’t bother to set a realistic User-Agent.


Scores are grouped into five threat levels for easier interpretation and action.

Score RangeLevelColorDescriptionRecommended Action
0-20MINIMALGreenVery low risk, likely legitimateAllow
21-40LOWLimeSome signals, probably benignLog
41-60MEDIUMYellowSuspicious activity detectedMonitor/Challenge
61-80HIGHOrangeStrong bot/malicious indicatorsChallenge/Block
81-100CRITICALRedAlmost certainly automated/maliciousBlock
Score: 12 | Level: MINIMAL | ● Green

Characteristics:

  • Few or no suspicious signals detected
  • Normal browsing patterns observed
  • Standard browser fingerprint
  • Good IP reputation

Interpretation: This is normal, legitimate traffic. The visitor behaves like a real human using a standard browser.

Recommended Actions:

  • Allow the request
  • No special logging required
  • No alerts needed

Score: 35 | Level: LOW | ● Lime

Characteristics:

  • Minor signals present (e.g., VPN usage, missing header)
  • No honeypot triggers
  • Mostly normal behavior patterns
  • Could be privacy-conscious user or minor automation

Interpretation: Some signals are present but likely benign. Could be a legitimate user with a VPN or unusual browser configuration.

Recommended Actions:

  • Allow the request
  • Log for pattern analysis
  • Monitor for escalation

Score: 52 | Level: MEDIUM | ● Yellow

Characteristics:

  • Multiple suspicious signals
  • Possible fingerprint anomalies
  • Unusual behavior patterns
  • May have triggered low-weight honeypots

Interpretation: Suspicious activity that warrants attention. Could be a scanner, scraper, or unsophisticated bot.

Recommended Actions:

  • Consider CAPTCHA challenge
  • Log with high priority
  • Alert on repeated occurrences
  • Manual review recommended

Score: 73 | Level: HIGH | ● Orange

Characteristics:

  • Strong indicators of automation
  • Likely honeypot triggers
  • Fingerprint clearly indicates bot/headless browser
  • Suspicious or malicious patterns

Interpretation: Almost certainly not a legitimate human user. This is likely a bot, scanner, or attacker.

Recommended Actions:

  • Challenge or block
  • Alert security team
  • Add IP to watchlist
  • Investigate the attack pattern

Score: 92 | Level: CRITICAL | ● Red

Characteristics:

  • Multiple high-confidence indicators
  • Attack signatures detected
  • Honeypot(s) triggered
  • Clear malicious intent

Interpretation: This is definitely automated or malicious traffic. Active attack or aggressive scanning in progress.

Recommended Actions:

  • Block immediately
  • Alert security team
  • Consider IP blocking at edge
  • Investigate and document
  • Report to threat intelligence if applicable

Beyond the numeric score, visitors are classified into categories based on which signals triggered.

Categories are determined by evaluating signals in priority order:

1. Attack Signatures ≥ 30 → ATTACKER
2. Honeypot ≥ 40 AND Fingerprint ≥ 30 → BOT
3. Honeypot ≥ 20 → SCANNER
4. User Agent matches crawler pattern → CRAWLER
5. Fingerprint ≥ 40 (without honeypot) → SCRAPER
6. User Agent ≥ 30 OR Headers ≥ 25 → SCRAPER
7. Default → LEGITIMATE
CategoryIconTriggersDescriptionTypical Score
Attacker⚠️Attack signatures (SQLi, XSS, etc.)Active exploitation attempts70-100
Bot🤖Honeypot + fingerprint anomaliesAutomated traffic with technical non-human signs60-90
Scanner📡Any honeypot/decoy triggerReconnaissance or vulnerability scanning40-80
Crawler🕷️Known crawler User-AgentWeb crawlers and indexing bots20-50
Scraper📋Fingerprint anomalies (no honeypot)Content scraping or data harvesting35-65
LegitimateAll signals below thresholdNormal human visitor0-25

Attacker:

Request: POST /api/login
Body: {"password": "' OR '1'='1"}
Attack Signature Score: 85
→ Category: ATTACKER

Bot:

Accessed: /admin/backup.zip (honeypot)
Fingerprint: WebDriver=true, no plugins
Honeypot Score: 75, Fingerprint Score: 68
→ Category: BOT

Scanner:

Accessed: /.git/config (decoy)
Normal fingerprint otherwise
Honeypot Score: 45
→ Category: SCANNER

Legitimate:

Normal browsing pattern
No honeypots triggered
All signals < thresholds
→ Category: LEGITIMATE

The Confidence percentage indicates how certain WebDecoy is about the threat assessment.

Confidence is based on the number and quality of active signals:

FactorImpact
More signal categories activeHigher confidence
Honeypot triggered+25% confidence boost
Strong fingerprint match+20% confidence boost
Only 1-2 weak signalsLower confidence
Conflicting signalsLower confidence
Base Confidence = (Active Categories / Total Categories) × 100
Adjustments:
+ 25% if honeypot triggered
+ 20% if strong fingerprint anomaly
- 15% if signals conflict
ConfidenceMeaningAction
80-100%Very certainAct on the score
60-79%Reasonably certainAct with monitoring
40-59%Moderate certaintyConsider challenging
20-39%Low certaintyLog and observe
0-19%Very uncertainCollect more data

Use CaseBlock ThresholdChallenge Threshold
Financial / Banking5540
E-commerce6550
Standard Websites7560
Public Content / Blogs8570
Monitoring OnlyN/A (log only)N/A
function handleRequest(detection) {
const { score, confidence, category } = detection;
// Critical threats - block immediately
if (score >= 80 && confidence >= 60) {
return blockRequest();
}
// High threats - challenge or block
if (score >= 60) {
if (category === 'attacker') {
return blockRequest();
}
return challengeWithCaptcha();
}
// Medium threats - log and monitor
if (score >= 40) {
logHighPriority(detection);
return allowWithMonitoring();
}
// Low/Minimal threats - allow
return allowRequest();
}

Use category filters in the Detections table to focus on specific threat types:

  • Attackers first: Filter to category = attacker to investigate active exploitation attempts
  • Scanner review: Filter to category = scanner to see what reconnaissance activity is happening
  • Legitimate verification: Filter to category = legitimate with high scores to find potential false positives

Reducing False Positives:

  1. Increase block threshold (e.g., 75 → 85)
  2. Add known good IPs to allowlist
  3. Verify good bots (Googlebot, Bingbot) by IP
  4. Review medium-score detections manually

Catching More Threats:

  1. Lower block threshold (e.g., 75 → 65)
  2. Add more honeypot links to pages
  3. Enable Bot Scanner Pro for JavaScript analysis
  4. Monitor category distribution for patterns

In the WebDecoy dashboard, click on any threat score to open the Score Explanation Dialog, which shows:

  1. Overview - What the unified score means
  2. How Scoring Works - The three-step calculation process
  3. Category Weights - Visual breakdown of all 8 categories
  4. Category Details - What each category detects and why it matters
  5. Threat Levels - The 5 risk levels and their meaning
  6. Threat Categories - How visitors are classified
  7. Confidence Factors - What affects certainty

This dialog helps you understand exactly why a visitor received their score and make informed decisions about your security policies.