Laravel Calendar日历模块预约数据随机删除 是否与现有删除逻辑相关
代码确实存在导致全量未预约日程被误删的风险,核心问题如下:
- 删除逻辑无所属用户过滤:你创建预约的时候限制了
doctor_id = $user->id,但删除逻辑完全没有加这个过滤条件,只要触发清除操作,就会删除全表所有符合时间范围、未预约的日程,而非仅当前操作医生的日程,这是最可能导致全局数据丢失的原因。 - 时间参数未做合法性校验:代码没有对
$ds(查询开始时间)和$de(查询结束时间)做有效性校验,如果前端传参异常、或者时间解析出错(比如空参数被Carbon解析为1970年、或者错误格式被解析为远未来时间),whereBetween的时间范围会覆盖全表所有数据,直接清空所有未预约的日程。 - 触发条件校验过松:
clear参数仅做了宽松相等判断,$r->clear == 1会匹配字符串"1"、布尔值true等多种类型的值,前端传参异常或者接口被恶意调用时很容易误触发删除逻辑。
修复方案:
- 给删除逻辑加上用户身份过滤,和创建逻辑保持一致:
$delete = Appointment::where('doctor_id', $user->id) // 新增用户身份过滤 ->whereBetween('ts_start', [ $ds, $de->copy()->addDay()->subSecond() ]) ->whereNull('booked') ->delete();
- 增加时间参数校验,限制最大可查询的时间范围,避免全表扫描+删除:
// 在删除逻辑前新增参数校验 if (!$ds instanceof Carbon || !$de instanceof Carbon || $ds->gt($de) || $de->diffInDays($ds) > 90) { return response()->json(['success' => false, 'message' => '时间范围不合法'], 400); }
- 收紧
clear参数的校验规则,用严格类型判断:
// 把原来的判断替换为严格校验 if ($r->filled('clear') && $r->integer('clear') === 1)
- 额外建议:给
Appointment模型开启Laravel软删除功能,同时给删除操作增加操作日志,记录操作人、请求参数、删除时间,后续出现异常可以快速回溯排查。
内容的提问来源于stack exchange,提问作者kishaxo
相关产品推荐
相关产品推荐

