使用PHP替代JavaScript实现Firebase Phone Authentication管控恶意请求
方案说明
该需求完全可以实现,核心逻辑是将发送验证码的权限收口到PHP后端,避免前端直接调用Firebase接口暴露可被恶意刷的入口,具体可按以下步骤落地:
1. 调整原有调用逻辑,废弃前端直接发验证码的方式
原有前端直接调signInWithPhoneNumber的逻辑要全部下线,改成先请求自有PHP后端接口,校验通过后再由PHP后端调用Firebase Admin SDK触发验证码发送。
调整后的前端示例逻辑:
// 先调用自己的PHP接口提交手机号+人机校验参数 fetch('/php/send_verify_sms.php', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ phone: phoneNumber, // 可选带人机校验token,比如滑块、图文验证码的校验结果 captcha_token: captchaResult }) }).then(res => res.json()).then(data => { if(data.code === 0) { log('SMS sent'); window.confirmationResult = data.confirmation_result; } else { log('Error : SMS not sent ' + data.msg); } }).catch(err => log('请求失败'+err));
2. PHP后端做多层限流校验
PHP侧对接收到的验证码发送请求做多重校验,只要有一项不通过就直接拒绝请求:
- 手机号维度限流:同一个手机号1分钟内最多请求1次,1小时内最多请求5次,24小时内最多请求10次,请求记录可存在Redis或者MySQL中
- IP维度限流:同一个IP1小时内最多请求20次,防止攻击者用不同手机号批量刷取
- 人机校验校验:如果前端传了人机校验的token,后端先校验token有效性,通过才走后续流程,能挡住90%以上的机器自动刷请求
- 异常手机号拦截:可内置规则拦截明显的虚拟号段、不符合手机号格式的请求
3. PHP后端调用Firebase Admin SDK发验证码
校验全部通过后,用PHP的Firebase Admin SDK调用发送验证码的接口,拿到confirmationResult后返回给前端即可,PHP侧的示例代码逻辑:
<?php // 初始化Firebase Admin SDK,需提前安装firebase/php-admin-sdk依赖 use Kreait\Firebase\Factory; $factory = (new Factory)->withServiceAccount('/path/to/firebase_credentials.json'); $auth = $factory->createAuth(); // 上面提到的各类校验逻辑此处省略 // 校验通过后调用Firebase发验证码 $phoneNumber = $_POST['phone']; $appVerifier = $_POST['recaptcha_token']; // 对应前端的reCAPTCHA token try { $confirmationResult = $auth->signInWithPhoneNumber($phoneNumber, $appVerifier); echo json_encode([ 'code' => 0, 'msg' => '发送成功', 'confirmation_result' => $confirmationResult ]); } catch (Exception $e) { echo json_encode([ 'code' => 1, 'msg' => $e->getMessage() ]); } ?>
临时轻量化备选方案
如果暂时不想调整前后端交互逻辑,也可以在Nginx层先做接口限流,针对Firebase认证接口的调用路径做IP和请求频率限制,不过这种方式的防护能力比后端收口的方案弱,仅适合作为临时过渡方案。
内容的提问来源于stack exchange,提问作者CoDevloop
相关产品推荐
相关产品推荐

