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

Laravel聊天应用如何防止用户篡改AJAX请求中的重要数据?

解决方案

核心原则:所有客户端提交的参数都不可信,所有权限校验必须在服务端完成,前端限制仅作为提升体验的辅助手段,不能作为安全依据。

  • 服务端新增接收方权限校验逻辑
    不要信任客户端提交的to_user参数,在处理发送消息的接口逻辑中,直接通过Auth::id()取当前登录用户ID(可以直接删掉前端传递的from_user参数,避免额外校验开销),校验当前登录用户和to_user的关系:比如是否互为好友、是否在同一个群组、是否有临时对话权限等,校验不通过直接返回403错误。
  • 优化聊天会话ID的校验逻辑
    你当前的请求参数已经携带了chat_id,正常每个聊天会话(单聊/群聊)的chat_id都对应固定的参与人列表,你可以直接通过chat_id查出所有合法的参与用户,同时判断to_user是否属于该会话的参与人、当前登录用户是否属于该会话,双重校验下即使用户同时篡改chat_id和to_user也无法绕过限制。
  • 可选:参数签名校验
    可以在页面渲染时,给每个当前用户可联系的对象生成带过期时间的签名,用to_user_id + 过期时间 + 服务端专属密钥生成哈希值,前端发请求时把签名和过期时间一同传给后端,后端校验签名合法性、是否过期,即使用户篡改to_user也无法生成合法签名。

接口逻辑参考代码

// 消息发送接口控制器逻辑
public function sendMessage(Request $request)
{
    // 直接取当前登录用户,不使用客户端传的from_user
    $fromUserId = Auth::id();
    $toUserId = $request->input('to_user');
    $chatId = $request->input('chat_id');

    // 1. 校验当前用户是否属于该聊天会话
    $chat = Chat::findOrFail($chatId);
    if (!$chat->users->contains($fromUserId)) {
        abort(403, '无权限操作该会话');
    }

    // 2. 校验接收方是否属于该聊天会话
    if (!$chat->users->contains($toUserId)) {
        abort(403, '接收方不属于当前会话');
    }

    // 3. 单聊场景额外校验好友关系
    if ($chat->type === 'private') {
        $isFriend = Friend::where('user_id', $fromUserId)
            ->where('friend_id', $toUserId)
            ->exists();
        if (!$isFriend) {
            abort(403, '无法向非好友用户发送消息');
        }
    }

    // 后续正常的消息存储、推送逻辑...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:09:00