厦门市规划建设局网站,深圳网站设计设计,手机网站制作教程,wordpress投稿者权限文章目录 概述危害修复建议与实施方案解决方案 1#xff1a;手动绑定数据解决方案 2#xff1a;使用 DTO 进行数据过滤解决方案 3#xff1a;启用字段白名单解决方案 4#xff1a;验证输入数据模式 验证修复有效性小结 概述 批量分配漏洞#xff08;Mass Assignment#… 文章目录 概述危害修复建议与实施方案解决方案 1手动绑定数据解决方案 2使用 DTO 进行数据过滤解决方案 3启用字段白名单解决方案 4验证输入数据模式 验证修复有效性小结 概述 批量分配漏洞Mass Assignment通常发生在后端代码使用自动数据绑定框架如 Java 的 SpringMVC 或其他 ORM 工具时没有对用户输入数据进行严格验证和过滤。
例如前端用户可以通过提交额外的参数如权限字段、敏感标志字段绕过后端验证将这些敏感字段意外绑定到对象中并持久化。 危害
特权升级恶意用户可以通过添加权限字段获取更高的系统权限。数据篡改恶意篡改业务关键字段或数据例如篡改订单状态、支付金额。绕过安全机制可以破坏访问控制策略导致未经授权的数据泄漏或修改。 修复建议与实施方案
解决方案 1手动绑定数据
避免直接使用框架的自动绑定功能改为手动提取输入参数并明确赋值。例如
RestController
public class RuleController {PostMapping(/ruleCompletion)public ResponseEntity? ruleCompletion(RequestBody MapString, Object payload) {Rule rule new Rule();rule.setName((String) payload.get(name));rule.setDescription((String) payload.get(description));// 仅绑定允许的字段return ResponseEntity.ok(service.saveRule(rule));}
}解决方案 2使用 DTO 进行数据过滤
通过定义 DTO数据传输对象仅包含允许的字段将用户输入限制为安全范围内的数据。
Data
public class RuleDTO {private String name;private String description;
}RestController
public class RuleController {PostMapping(/ruleCompletion)public ResponseEntity? ruleCompletion(RequestBody RuleDTO ruleDTO) {Rule rule new Rule();BeanUtils.copyProperties(ruleDTO, rule); // 将 DTO 数据复制到实体中return ResponseEntity.ok(service.saveRule(rule));}
}解决方案 3启用字段白名单
对于常见 ORM如 Hibernate绑定可以启用字段白名单指定哪些字段可以被更新
Entity
public class Rule {Column(updatable false)private Long id; // 禁止外部更新private String name;Column(updatable false)private String sensitiveField; // 禁止外部更新的敏感字段
}解决方案 4验证输入数据模式
结合 JSON Schema 或其他验证框架严格定义输入数据结构。
Component
public class RuleValidator {public void validate(RuleDTO ruleDTO) {if (StringUtils.isEmpty(ruleDTO.getName())) {throw new IllegalArgumentException(Name cannot be empty);}// 其他自定义验证规则}
}验证修复有效性
确保修复后以下输入无法篡改敏感数据
测试 1尝试注入非预期字段如 admintrue。测试 2尝试修改受保护字段如 id。测试 3验证业务逻辑中绑定的字段是否均在允许范围内。
Test
public void testMassAssignmentPrevention() {MockMvc mockMvc MockMvcBuilders.standaloneSetup(new RuleController()).build();String maliciousPayload {\name\:\test\,\admin\:\true\};mockMvc.perform(post(/ruleCompletion).contentType(MediaType.APPLICATION_JSON).content(maliciousPayload)).andExpect(status().isBadRequest());
}小结
四种修复方法包括手动绑定、DTO 使用、字段白名单和数据模式验证。