@webdecoy/fcaptcha 1.27.0 → 1.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/server.js +12 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webdecoy/fcaptcha",
3
- "version": "1.27.0",
3
+ "version": "1.28.1",
4
4
  "description": "Open source CAPTCHA with PoW, bot detection, and Vision AI protection",
5
5
  "main": "index.js",
6
6
  "exports": {
package/server.js CHANGED
@@ -1425,11 +1425,13 @@ function runVerification(signals, ip, siteKey, userAgent, headers = {}, ja3Hash
1425
1425
  category: 'bot',
1426
1426
  score: 0.7,
1427
1427
  confidence: 0.8,
1428
- reason: `PoW verification failed: ${powVerification.reason}`,
1429
- // A solution that does not verify against a challenge this server
1430
- // issued is not weak evidence of automation, it is proof the challenge
1431
- // was not completed. See DISPOSITIVE_FLOOR.
1432
- dispositive: true
1428
+ reason: `PoW verification failed: ${powVerification.reason}`
1429
+ // Deliberately NOT dispositive. The gate already withholds the token,
1430
+ // which is the security requirement. Flooring the score as well says
1431
+ // "blatant bot", and a failed proof of work does not mean that: the
1432
+ // challenge expires after five minutes, challenges live only in memory
1433
+ // so every deploy invalidates the outstanding ones, and a double-click
1434
+ // replays a solution. All ordinary things that happen to real people.
1433
1435
  });
1434
1436
  } else {
1435
1437
  powSatisfied = true;
@@ -1447,8 +1449,8 @@ function runVerification(signals, ip, siteKey, userAgent, headers = {}, ja3Hash
1447
1449
  category: 'bot',
1448
1450
  score: 0.9,
1449
1451
  confidence: 0.9,
1450
- reason: 'Challenge nonce mismatch (signals not bound to challenge)',
1451
- dispositive: true
1452
+ reason: 'Challenge nonce mismatch (signals not bound to challenge)'
1453
+ // Not dispositive — see above; a stale challenge produces this too.
1452
1454
  });
1453
1455
  }
1454
1456
  }
@@ -1480,8 +1482,9 @@ function runVerification(signals, ip, siteKey, userAgent, headers = {}, ja3Hash
1480
1482
  category: 'bot',
1481
1483
  score: 0.9,
1482
1484
  confidence: 0.95,
1483
- reason: 'No PoW solution provided',
1484
- dispositive: true
1485
+ reason: 'No PoW solution provided'
1486
+ // Not dispositive — the gate refuses the token; inflating the score on
1487
+ // top only mislabels whoever hit a stale page.
1485
1488
  });
1486
1489
  }
1487
1490