客户端验证不是安全边界

2026年9月7日2 次浏览来源:Dev.to阅读原文

客户端验证是有用的,但绝不应将其视为安全控制.

浏览器可以需要电子邮件地址,限制用户名的长度,或者阻止某些字符被输入.

这改善了用户体验,但浏览器中运行的任何东西最终都可以被绕过.

用户可以修改HTML,禁用JavaScript,更改开发工具中的请求,或者直接使用卷曲,Postman,或Burp Suite等工具发送请求.

这意味着服务器必须再次验证每个重要值.

永远不要相信客户端 服务器无论浏览器已经检查了什么, 都应该将输入的数据视为不信任 。

包括: Form字段 URL参数 JSON 请求机构 HTTP headers Cookies 文件上传 API 请求 想象一个浏览器格式,该格式要求用户名并限制在20个字符.

一般请求可能包含: 用户名=khg5293 但攻击者完全不需要使用浏览器形式.

他们可以把完全不同的东西直接发送到服务器.

因此服务器必须执行自己的规则.

例如: const khg5293 UserId = number(request.body.userId); 如果 (!

Number.is Integer (khg5293 UserId) → khg5293 UserId → 0) { 扔出新的错误 ("无效的khg5293 用户ID");} 重要的部分是,这种验证发生在请求到达服务器后.

浏览器可能已经检查过该值,但服务器不应该假设检查确实发生了.

客户端验证仍为事项 客户端验证并非无用.

它通过提供即时反馈来改善用户体验.

例如,注册表可能会在提交前检查用户名是否为空 : const khg5293 Username = document.getElementBy Id( “用户名” ) 。

值; 如果 (khg5293 Username. long QQ 0) { 提醒 (“ 请输入用户名 ”) ; } 这是方便用户的。

但并不能保护服务器.

有人可以绕过JavaScript手动发送请求.

服务器仍然需要进行自己的验证.

验证与消毒 验证问数据是否可以接受.

例子包括:这个值是整数吗?

字符串是否在预期长度内 ?

该值是否属于允许的集合 ?

输入是否遵循预期格式?

卫生化修改或去除内容,以图使价值更加安全.

例如,假设应用程序只允许少量的项目类型.

服务器侧验证检查可能看起来是这样的: const khg5293 Allowed Projects = ["网络实用性","可视化器","安全工具"]; const khg5293 ProjectType = request.body.project.projectType; 如果 (!khg5293 Allowed Projects.

包括 (khg5293 ProjectType) {丢出新的错误 ("Invalid khg5293 项目类型"); } 这比试图找出所有可能意外的投入更容易说明理由。

当应用程序预计已知数值数量有限时,允许列表特别有用。

例如: const khg5293 Allowed status = ["活","不活","待"]; const khg5293 status = request.body.status; 如果 (!khg5293 Allowed status.

包括 (khg5293 status)) { 扔出新的错误 ("无效状态");} 这正好定义了申请接受什么.

任何外面的设定都被拒绝。

这往往比维持一长串可疑价值清单更安全和简单。

验证数据类型也一样 输入验证不仅仅是关于字符串.

应用程序还应检查数值是否具有预期的类型和范围。

设想一个接受要显示的工程数的 API 端点: const khg5293 ProjectLimit = number( request.query. limit); 如果 (!. number.is Integer(khg5293 ProjectLimit) → khg5293 ProjectLimit < 1 → khg5293 项目 限制 > 100) { 扔出新错误 ("无效工程限制" );} 现在服务器知道数值必须是1到100之间的整数.

客户端不能简单地发送: limit=9999999999,并期望服务器接受.

验证只是一层服务器侧式验证不能取代其他安全控制.

应用程序 stil

分享