You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动