在业务开发中,不少团队为了简化流程,会在客户端直接做授权检查,比如判断用户是否登录、是否拥有某个操作权限,但是这种方式存在严重的安全缺陷,必须配合服务端的安全实践才能构建可靠的防护体系。

客户端授权检查的常见风险
环境可控导致逻辑被绕过
客户端运行在用户设备上,用户可以通过抓包工具、逆向工程修改客户端的执行逻辑,直接跳过授权检查的判断步骤。比如原本客户端会判断用户角色为管理员才显示删除按钮,攻击者修改判断条件后,普通用户也能触发删除操作。
校验规则易被逆向获取
客户端的授权检查逻辑最终会编译成可执行的代码,攻击者可以通过反编译工具获取完整的校验规则,针对性地构造请求绕过限制。比如客户端用固定的密钥生成授权令牌,攻击者拿到密钥后就能伪造合法的授权信息。
无法防止请求伪造
即使客户端做了完善的授权检查,攻击者也可以不通过客户端,直接构造符合格式的HTTP请求发送给服务端。客户端的所有检查对这类直接请求都没有约束力,很容易出现越权访问的问题。
服务端安全实践方案
统一的接口鉴权机制
所有需要权限的接口都必须在服务端做鉴权,不能依赖客户端的判断结果。常用的做法是使用JWT或者Session机制,每次请求都携带身份凭证,服务端验证凭证的合法性和有效性。
以下是一个基于Node.js的JWT鉴权中间件示例:
const jwt = require('jsonwebtoken');
const secret = 'your_jwt_secret'; // 实际项目中建议使用环境变量存储
// 鉴权中间件
function authMiddleware(req, res, next) {
// 从请求头获取token
const token = req.headers.authorization && req.headers.authorization.split(' ')[1];
if (!token) {
return res.status(401).json({ code: 401, message: '未登录,请先登录' });
}
try {
// 验证token
const decoded = jwt.verify(token, secret);
// 把用户信息挂载到请求对象上
req.user = decoded;
next();
} catch (err) {
return res.status(401).json({ code: 401, message: 'token无效或已过期' });
}
}
module.exports = authMiddleware;
细粒度的权限校验
鉴权通过只是第一步,还需要根据用户的角色、资源归属做更细粒度的权限校验,避免水平越权和垂直越权问题。比如用户A只能操作自己的订单,不能访问用户B的订单数据。
以下是订单查询接口的权限校验示例:
const orderService = require('../services/orderService');
// 查询订单详情接口
async function getOrderDetail(req, res) {
const orderId = req.params.orderId;
const userId = req.user.id; // 从鉴权中间件获取的用户ID
// 查询订单数据
const order = await orderService.getOrderById(orderId);
if (!order) {
return res.status(404).json({ code: 404, message: '订单不存在' });
}
// 校验订单归属,只有订单所属用户才能查看
if (order.userId !== userId && req.user.role !== 'admin') {
return res.status(403).json({ code: 403, message: '没有权限访问该订单' });
}
res.json({ code: 200, data: order });
}
输入参数校验与数据脱敏
服务端需要对所有接收的参数做合法性校验,避免SQL注入、XSS等攻击。同时对于返回给客户端的数据,要根据用户的权限做脱敏处理,比如普通用户查看订单时,隐藏其他用户的手机号、地址等敏感信息。
操作日志与异常监控
记录所有敏感操作的日志,包括操作人、操作时间、操作内容、请求IP等信息,方便出现安全问题后溯源。同时设置异常监控,当出现大量越权访问、异常请求时及时告警,快速响应安全事件。
总结
客户端授权检查只能作为提升用户体验的辅助手段,绝对不能作为安全屏障。所有涉及权限、安全的逻辑都必须在服务端实现,结合统一的鉴权、细粒度权限校验、参数校验、数据脱敏等实践,才能有效避免客户端授权检查带来的风险,保障业务系统的安全稳定运行。