WordPress自定义反欺诈插件中指纹生成记录与拦截校验不一致问题求助
WordPress自定义反欺诈插件中指纹生成记录与拦截校验不一致问题求助
我现在在维护一个搭了BuddyPress、用BuddyX Pro主题和Wise Chat Pro插件的WordPress站点,最近一直在处理群聊页面的滥用问题——用户动不动就用TOR或者VPN绕开IP封禁。为了加强安全,我写了个自定义插件,功能如下:
插件核心功能
- IP地址检测:用MaxMind查IP地理位置,识别是否是已知代理/VPN,还可以选ProxyCheck.io API(目前是禁用状态)
- 设备指纹生成:给每个设备生成两套指纹——高级指纹(结合服务端+客户端数据)和备用指纹(仅服务端数据)。说明:我知道这不是100%可靠,但在我的场景里就是想多一层保障
- 爬虫白名单:已知的爬虫(比如谷歌、微软的)直接放行
- 地域拦截规则:特定国家(比如中国、俄罗斯)的IP直接拦截并跳转页面
插件运行流程
- IP拦截:不符合条件的IP(地域、VPN状态)能正常跳转
- 指纹存储:两套指纹会被哈希处理后存在加密的JSON文件里,5天后自动清理
- 指纹手动拦截:我加了手动拉黑特定指纹的功能作为最后手段,功能本身是通的,但现在遇到一个问题:用于校验黑名单的指纹和写入JSON文件的指纹对不上
具体问题细节
我写了生成指纹的函数:
function generate_fingerprint() { $fallback = generate_fallback_fingerprint(); $advanced = generate_advanced_fingerprint(); $combined = md5($fallback . $advanced); $reliability = calculate_reliability_score(); return [ 'fallback_fingerprint' => $fallback, 'advanced_fingerprint' => $combined, 'reliability_score' => $reliability ]; }
然后把这套指纹存到fingerprints.json日志文件里:
function save_fingerprint($ip, $fingerprint_data) { $data = []; if (file_exists(FINGERPRINT_FILE)) { $data = json_decode(file_get_contents(FINGERPRINT_FILE), true) ?? []; } $timestamp = time(); $key = $ip . '_' . $timestamp; $data[$key] = [ 'ip' => $ip, 'fallback_fingerprint' => $fingerprint_data['fallback_fingerprint'], 'advanced_fingerprint' => $fingerprint_data['advanced_fingerprint'], 'reliability_score' => $fingerprint_data['reliability_score'], 'timestamp' => $timestamp, // 'client_data' => $_POST // Only enabled when needed for debugging ]; file_put_contents(FINGERPRINT_FILE, json_encode($data, JSON_PRETTY_PRINT)); }
用户返回站点时,我本以为生成的指纹(不管是高级还是备用)会和JSON里存的一致,要是在黑名单里就跳转,但实际完全不是这么回事。
校验黑名单的代码是这样的:
$blocked_fingerprints = get_blocked_fingerprints(); if (in_array($fingerprint_data['fallback_fingerprint'], $blocked_fingerprints)) { wp_safe_redirect($redirect_url); exit; } if (in_array($fingerprint_data['advanced_fingerprint'], $blocked_fingerprints)) { wp_safe_redirect($redirect_url); exit; }
但用于校验的指纹和JSON文件里存的根本对不上。
我特意把校验时的指纹写到错误日志里:
$fingerprint_data = generate_fingerprint(); save_fingerprint($fingerprint_data); error_log("Fingerprint saved for IP: $ip");
结果错误日志里的指纹和JSON里的完全不一样——就连本应该每次都一致的服务端备用指纹都对不上。这说明指纹生成/哈希的逻辑在存储和校验时是不一样的,但我完全找不到原因。
我的插件文件结构是:
/wp-content/plugins/pluginname/block-anonymous.php/wp-content/plugins/pluginname/fingerprint.js(在页面头部加载)- 核心代码片段是通过WPCode插件在特定页面的头部执行的
目前正常工作的部分
- 不符合条件的IP能正常跳转
- 白名单爬虫能正常放行
- 两套指纹能正常生成并存到JSON里,而且这些指纹在多次会话、多天里都是稳定一致的,每个设备唯一
- 5天后旧指纹会自动清理
- 手动拉黑指纹功能本身有效,但指纹对比始终不一致
我已经尝试过的方法
- 打日志确认:校验时生成的指纹和存储的确实对不上,不管是高级还是备用指纹
- 加
sleep()延迟存储,给站点足够时间生成正确指纹——没用 - 已经花了4天排障,甚至找ChatGPT帮忙,但一直在绕圈子,没找到解决办法
- 现在我都怀疑自己是不是理解错问题了,实在没思路了,希望有人能从全新的角度帮我看看这个指纹不匹配的问题
备注:内容来源于stack exchange,提问作者Flower88




