Web安全 - API 成批分配毛病的四种修复方案

打印 上一主题 下一主题

主题 1627|帖子 1627|积分 4881



概述


批量分配毛病(Mass Assignment)通常发生在后端代码利用自动数据绑定框架(如 Java 的 SpringMVC 或其他 ORM 工具)时,没有对用户输入数据进行严格验证和过滤。
比方前端用户可以通过提交额外的参数(如权限字段、敏感标记字段)绕事后端验证,将这些敏感字段不测绑定到对象中并长期化。

危害



  • 特权升级:恶意用户可以通过添加权限字段获取更高的系统权限。
  • 数据窜改:恶意窜改业务关键字段或数据,比方窜改订单状态、支付金额。
  • 绕过安全机制:可以破坏访问控制计谋,导致未经授权的数据走漏或修改。

修复建议与实行方案

办理方案 1:手动绑定数据

避免直接利用框架的自动绑定功能,改为手动提取输入参数并明确赋值。比方:
  1. @RestController
  2. public class RuleController {
  3.     @PostMapping("/ruleCompletion")
  4.     public ResponseEntity<?> ruleCompletion(@RequestBody Map<String, Object> payload) {
  5.         Rule rule = new Rule();
  6.         rule.setName((String) payload.get("name"));
  7.         rule.setDescription((String) payload.get("description"));
  8.         // 仅绑定允许的字段
  9.         return ResponseEntity.ok(service.saveRule(rule));
  10.     }
  11. }
复制代码

办理方案 2:利用 DTO 进行数据过滤

通过定义 DTO(数据传输对象)仅包含允许的字段,将用户输入限定为安全范围内的数据。
  1. @Data
  2. public class RuleDTO {
  3.     private String name;
  4.     private String description;
  5. }
  6. @RestController
  7. public class RuleController {
  8.     @PostMapping("/ruleCompletion")
  9.     public ResponseEntity<?> ruleCompletion(@RequestBody RuleDTO ruleDTO) {
  10.         Rule rule = new Rule();
  11.         BeanUtils.copyProperties(ruleDTO, rule); // 将 DTO 数据复制到实体中
  12.         return ResponseEntity.ok(service.saveRule(rule));
  13.     }
  14. }
复制代码

办理方案 3:启用字段白名单

对于常见 ORM(如 Hibernate)绑定,可以启用字段白名单,指定哪些字段可以被更新:
  1. @Entity
  2. public class Rule {
  3.     @Column(updatable = false)
  4.     private Long id; // 禁止外部更新
  5.     private String name;
  6.     @Column(updatable = false)
  7.     private String sensitiveField; // 禁止外部更新的敏感字段
  8. }
复制代码

办理方案 4:验证输入数据模式

结合 JSON Schema 或其他验证框架,严格定义输入数据结构。
  1. @Component
  2. public class RuleValidator {
  3.     public void validate(RuleDTO ruleDTO) {
  4.         if (StringUtils.isEmpty(ruleDTO.getName())) {
  5.             throw new IllegalArgumentException("Name cannot be empty");
  6.         }
  7.         // 其他自定义验证规则
  8.     }
  9. }
复制代码

验证修复有效性

确保修复后,以下输入无法窜改敏感数据:


  • 测试 1:实验注入非预期字段(如 admin=true)。
  • 测试 2:实验修改受掩护字段(如 id)。
  • 测试 3:验证业务逻辑中绑定的字段是否均在允许范围内。
  1. @Test
  2. public void testMassAssignmentPrevention() {
  3.     MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new RuleController()).build();
  4.     String maliciousPayload = "{"name":"test","admin":"true"}";
  5.     mockMvc.perform(post("/ruleCompletion")
  6.             .contentType(MediaType.APPLICATION_JSON)
  7.             .content(maliciousPayload))
  8.             .andExpect(status().isBadRequest());
  9. }
复制代码

小结

四种修复方法,包括手动绑定、DTO 利用、字段白名单和数据模式验证。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表