You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel项目虚假用户注册及垃圾邮件问题排查与解决方案求助

嘿,我来帮你捋一捋这个问题——我之前也碰到过类似的垃圾注册+表单轰炸情况,先给你拆解下原因,再给几个实际能用的解决方案:

问题定位

首先可以明确:这大概率是自动化爬虫/机器人攻击,而非代码或主机本身的问题(除非主机被植入恶意脚本,但你只有注册和联系表单出现异常,更倾向于机器人绕过了你的reCaptcha验证)。

至于reCaptcha失效的原因,常见的有两种:

  • 你用的是reCaptcha v2普通模式,现在很多机器人能通过图像识别或打码平台绕过;
  • 只在前端做了reCaptcha验证,后端完全没校验——机器人可以直接跳过前端页面,直接请求后端接口提交数据,等于白加了验证。
针对性解决方案

下面这些方法都是我实际用过的,组合起来用效果会很好:

1. 修复并强化reCaptcha验证

  • 优先换成reCaptcha v3的严格模式,给注册、联系表单分别设置专属动作(比如注册设为register,联系表单设为contact),后端判断分数低于0.6就拒绝请求;
  • 核心:一定要在后端校验reCaptcha响应!这是很多人忽略的点,给你个Laravel后端校验的示例:
    // 在注册控制器或联系表单控制器里添加校验逻辑
    $response = Http::post('https://www.google.com/recaptcha/api/siteverify', [
        'secret' => env('RECAPTCHA_SECRET_KEY'),
        'response' => request('g-recaptcha-response'),
        'remoteip' => request()->ip(),
    ]);
    
    if (!$response->json('success') || $response->json('score') < 0.6) {
        return back()->withErrors(['recaptcha' => '验证失败,请重试']);
    }
    

2. 添加额外的防机器人陷阱

  • 隐藏字段陷阱:在表单里加一个用CSS隐藏的input,正常用户看不到不会填,但机器人会自动填充。后端只要检测到这个字段有值,直接拒绝请求:
    <!-- 表单中添加隐藏字段 -->
    <input type="text" name="honeypot" style="display: none !important;">
    
    // 后端校验
    if (!empty(request('honeypot'))) {
        abort(403, '无效请求');
    }
    
  • 时间验证:记录用户打开表单到提交的时间,如果少于3秒(正常用户填信息至少需要几秒)就拒绝。可以在表单里加个隐藏字段存当前时间戳:
    <input type="hidden" name="submit_start" value="{{ time() }}">
    
    // 后端计算时间差
    if (time() - request('submit_start') < 3) {
        return back()->withErrors(['timeout' => '请稍候再提交']);
    }
    

3. 限制请求频率

用Laravel自带的throttle中间件,限制同一IP在短时间内的请求次数,比如1分钟内最多3次注册/表单提交:

// 在路由中添加中间件
Route::post('/register', [RegisterController::class, 'store'])->middleware('throttle:3,1');
Route::post('/contact', [ContactController::class, 'send'])->middleware('throttle:3,1');

如果攻击更严重,可以用Redis记录IP请求次数,超过阈值就拉黑1小时。

4. 优化注册流程过滤虚假用户

  • 强制邮箱验证后才能使用联系表单:虚假用户基本不会去验证邮箱,这样即使注册成功,也无法提交垃圾邮件。Laravel自带邮箱验证功能,只要在User模型中实现MustVerifyEmail接口即可:
    class User extends Authenticatable implements MustVerifyEmail
    {
        // ... 模型原有代码
    }
    
  • 给姓名字段加格式校验:限制姓名只能是字母+空格,拒绝随机字符串的虚假姓名:
    $request->validate([
        'first_name' => 'required|regex:/^[A-Za-z\s]+$/',
        'last_name' => 'required|regex:/^[A-Za-z\s]+$/',
        // 其他字段规则
    ]);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:23:12