Access denied.

'; return; } // Filters (GET). All optional. $days = isset($_GET['days']) && ctype_digit((string)$_GET['days']) ? max(1, min(365, (int)$_GET['days'])) : MultiAccount::WINDOW_DAYS; $minScore = isset($_GET['min']) && ctype_digit((string)$_GET['min']) ? max(0, min(100, (int)$_GET['min'])) : MultiAccount::MIN_REPORT_SCORE; $focusUid = isset($_GET['focus']) && ctype_digit((string)$_GET['focus']) ? (int)$_GET['focus'] : 0; $data = MultiAccount::riskPairs(['days' => $days, 'min_score' => $minScore, 'focus_uid' => $focusUid]); $pairs = $data['pairs']; ?>

Multi-Account Detection

Heuristic correlation of account pairs by shared IP, subnet, device/browser fingerprint (User-Agent), overlapping login times, and resource-transfer flow. This is a risk score, not proof — use it to prioritise which pairs a human should investigate. Nothing is banned automatically.

reset
Row cap reached while scanning login history (window is large / very busy server). Results still valid but may be incomplete — narrow the window for full coverage.
Window: last days  |  scanned login-log + fingerprint rows  |  suspicious pair  | focused on UID
No account pairs at or above the current score threshold.
Tip: the User-Agent signal starts filling in only after players log in once with this feature deployed. IP & login-time signals work on existing history immediately. Try lowering the minimum score or widening the window.
Risk Account A Account B Why
# login log focus # login log focus
IPs:
0): ?>
transfer volume: res