You need to enable JavaScript to run this app. 如何保护WordPress REST API仅允许自有Android应用访问
优惠活动
大模型
产品
解决方案
定价
更多

如何保护WordPress REST API仅允许自有Android应用访问

无用户登录场景下WP REST API仅限自有安卓应用访问的防护方案

以下两种方案均无需用户登录操作即可实现接口权限控制:

方案1:固定API密钥校验(实现成本最低)

适合普通安全需求场景,实现步骤如下:

  • 生成一串长度不少于32位的随机字符串作为专属API密钥,妥善保存
  • 安卓端将密钥内置到应用中,可通过NDK将密钥存入so库做混淆,降低反编译泄露风险,所有发起的REST API请求均在请求头中加入自定义字段X-APP-KEY: 预设的API密钥
  • 在WordPress站点的主题functions.php文件或自定义插件中添加拦截校验逻辑,所有接口请求均校验请求头中的密钥是否匹配,不匹配直接返回403错误:
add_filter('rest_pre_dispatch', function ($result, $server, $request) {
    // 替换为你自己生成的API密钥
    $preset_key = 'YOUR_CUSTOM_RANDOM_APP_KEY';
    $request_key = $request->get_header('x-app-key');
    if ($request_key !== $preset_key) {
        return new WP_Error('rest_forbidden', '无权访问', ['status' => 403]);
    }
    return $result;
}, 10, 3);

方案2:动态签名校验(安全性更高)

适合对安全性要求较高的场景,可避免固定密钥泄露导致的接口全量暴露风险,同时可以防重放攻击:

  • 前后端提前约定相同的签名密钥、签名算法(推荐使用HMAC-SHA256)
  • 安卓端每次发起请求时,按规则拼接请求参数、当前10位时间戳、签名密钥后生成签名,将时间戳、签名值一并放入请求头中传输
  • WordPress侧收到请求后先校验时间戳与服务器当前时间差不超过5分钟,再按相同规则生成签名做对比,校验通过才允许访问:
add_filter('rest_pre_dispatch', function ($result, $server, $request) {
    // 替换为你约定的签名密钥
    $sign_secret = 'YOUR_CUSTOM_SIGN_SECRET';
    $request_time = $request->get_header('x-timestamp');
    $request_sign = $request->get_header('x-sign');
    
    // 校验请求有效期,防止重放攻击
    if (abs(time() - (int)$request_time) > 300) {
        return new WP_Error('rest_forbidden', '请求已过期', ['status' => 403]);
    }
    
    // 按约定规则生成签名做校验
    $params = $request->get_params();
    ksort($params);
    $sign_raw = http_build_query($params) . "&timestamp={$request_time}&key={$sign_secret}";
    $valid_sign = hash_hmac('sha256', $sign_raw, $sign_secret);
    
    if ($request_sign !== $valid_sign) {
        return new WP_Error('rest_forbidden', '签名校验失败', ['status' => 403]);
    }
    return $result;
}, 10, 3);

内容的提问来源于stack exchange,提问作者Muhammad Ibrahim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 08:36:03