#51 fixed this class of bug in wp_webdecoy_blocked_ips. The same defect remains in two other
tables, found while reviewing the 2.3.2 diff (PR #54) and deliberately left out of a safety release.
Both are unverified — the verification agents that would have confirmed them died mid-review.
Treat the line references as leads, not findings.
1. wp_webdecoy_checkout_attempts.created_at
Written with current_time('mysql') (site-local) at includes/class-webdecoy-woocommerce.php:217,
read against a gmdate()-generated threshold in get_recent_attempts() (:290).
Consequence: on a site east of UTC the window is wider than configured, and west of UTC it is
narrower — so checkout velocity and card-testing detection operate over the wrong window. The
direction of the error depends on the sign of gmt_offset, which is why it has never looked broken.
2. detections.created_at vs the Detections page date filters
Written site-local at includes/class-webdecoy-detector.php:245, webdecoy.php:1744, :1851,
:2558, and includes/class-webdecoy-woocommerce.php:350. The Today / 7d / 30d quick filters build
their bounds with gmdate('Y-m-d') in admin/partials/detections-page.php.
Consequence: "Today" is the wrong day for part of every day on any non-UTC site.
Work
Why not in 2.3.2
A safety release should reduce blast radius, not rewrite timestamp semantics across three tables.
The block table was in scope because a wrong comparison there meant blocking silently did nothing.
These two only skew a reporting window.
#51 fixed this class of bug in
wp_webdecoy_blocked_ips. The same defect remains in two othertables, found while reviewing the 2.3.2 diff (PR #54) and deliberately left out of a safety release.
Both are unverified — the verification agents that would have confirmed them died mid-review.
Treat the line references as leads, not findings.
1.
wp_webdecoy_checkout_attempts.created_atWritten with
current_time('mysql')(site-local) atincludes/class-webdecoy-woocommerce.php:217,read against a
gmdate()-generated threshold inget_recent_attempts()(:290).Consequence: on a site east of UTC the window is wider than configured, and west of UTC it is
narrower — so checkout velocity and card-testing detection operate over the wrong window. The
direction of the error depends on the sign of
gmt_offset, which is why it has never looked broken.2.
detections.created_atvs the Detections page date filtersWritten site-local at
includes/class-webdecoy-detector.php:245,webdecoy.php:1744,:1851,:2558, andincludes/class-webdecoy-woocommerce.php:350. The Today / 7d / 30d quick filters buildtheir bounds with
gmdate('Y-m-d')inadmin/partials/detections-page.php.Consequence: "Today" is the wrong day for part of every day on any non-UTC site.
Work
get_date_from_gmt()— and apply it to both tablesshifts them all by the current offset is wrong for any site that has changed timezone.
Why not in 2.3.2
A safety release should reduce blast radius, not rewrite timestamp semantics across three tables.
The block table was in scope because a wrong comparison there meant blocking silently did nothing.
These two only skew a reporting window.