客户端验证是有用的,但绝不应将其视为安全控制.
浏览器可以需要电子邮件地址,限制用户名的长度,或者阻止某些字符被输入.
这改善了用户体验,但浏览器中运行的任何东西最终都可以被绕过.
用户可以修改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