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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:09:03