如何在PHP Laravel网站中配置仅允许有效Gmail用户注册?
Laravel注册仅允许Gmail邮箱+防恶意注册配置方案
你当前的问题核心是仅做了前端表单渲染,没有加任何服务端强制校验规则——前端的输入框类型、placeholder提示对自动化机器人完全无效,机器人可以直接构造POST请求绕过前端提交任意内容,必须从服务端规则、防刷机制两层做配置:
1. 配置服务端邮箱校验规则
找到处理注册请求的控制器(通常是app/Http/Controllers/Auth/RegisterController.php,如果是自定义注册逻辑就找对应绑定注册路由的控制器),在请求校验逻辑中给email字段增加强制后缀校验,示例代码如下:
$validatedData = $request->validate([ 'name' => 'required|string|max:255', 'username' => 'required|string|max:255|unique:users,username', // 邮箱字段核心校验规则 'email' => [ 'required', 'string', 'email:rfc', 'max:255', 'unique:users,email', 'ends_with:@gmail.com', // 强制校验邮箱后缀必须为@gmail.com // 可选规则:拦截机器人常用的Gmail别名邮箱 function ($attribute, $value, $fail) { $emailPrefix = explode('@', $value)[0]; // 拦截带+号的别名、前缀带多个点号的批量生成邮箱 if (str_contains($emailPrefix, '+') || substr_count($emailPrefix, '.') > 1) { $fail('请使用标准格式的Gmail邮箱注册,不支持别名邮箱'); } } ], 'tel' => 'required|string|max:20', 'gender' => 'required|string|in:male,female,other', 'item' => 'required|string|max:1000', // 蜜罐字段校验,对应后面加的隐藏表单字段 'website' => 'prohibited' ]);
注意:所有校验必须在服务端完成,前端的输入限制、格式提示仅用于优化正常用户的使用体验,对恶意请求没有任何拦截能力。
2. 配置基础防机器人刷量规则
仅限制邮箱后缀无法完全挡住批量恶意注册,加3个零成本的配置就能拦住绝大多数自动化攻击:
- 确认注册路由在
routes/web.php中定义,且处于web中间件组下,你表单里已经写了@csrf,只要走web中间件就会自动开启CSRF令牌校验,拦截跨站伪造的注册请求 - 给注册接口加请求频率限制,直接在路由定义后面追加节流中间件,限制单个IP1分钟最多只能提交5次注册请求,配置示例:
Route::post('/register', [RegisterController::class, 'store'])->middleware('throttle:5,1'); - 在注册表单中加蜜罐字段,用来识别自动填充表单的机器人,在现有表单代码里加一段隐藏输入框:
只要这个字段被填充,之前加的<!-- 蜜罐字段:正常用户看不到不会填写,机器人扫描表单会自动填充 --> <div class="form-group" style="position:absolute;left:-9999px;top:-9999px;"> <input type="text" name="website" tabindex="-1" autocomplete="off"> </div>website => 'prohibited'校验规则会直接拒绝请求,不需要额外开发逻辑就能拦截90%以上的低级自动化注册脚本。
3. 可选前端体验优化
可以给邮箱输入框加前端即时提示,用户输入非Gmail后缀时实时提醒,减少正常用户输错邮箱的概率,但不要把拦截逻辑只写在前端。
内容的提问来源于stack exchange,提问作者James Kwesi Nartey
相关产品推荐
相关产品推荐

