如何保护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) . "×tamp={$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
相关产品推荐
相关产品推荐

