解决高风险代码:Mass Assignment: Insecure Binder Configuration

Abstract
用于将 HTTP 请求参数绑定到模型类的框架绑定器未显式配置为允许或禁止特定属性

Explanation
为便于开发和提高生产率,现代框架允许自动实例化一个对象,并使用名称与要绑定的类的属性相匹配的
HTTP 请求参数填充该对象。对象的自动实例化和填充加快了开发速度,但如果不谨慎实施,会导致严重的
问题。绑定类或嵌套类中的任何属性都将自动绑定到 HTTP 请求参数。因此,恶意用户能够将值分配给绑定
类或嵌套类中的任意属性,即使这些属性未通过 Web 表单或 API 合约暴露给客户端也是如此。 例 1: 只需使
用 Spring MVC 而无需进行额外配置,以下控制器方法即可将 HTTP 请求参数绑定到 User 或 Details 类中
的任何属性:
@RequestMapping(method = RequestMethod.POST)
public String registerUser(@ModelAttribute(“user”) User user, BindingResult
result, SessionStatus status) {
if (db.save(user).hasErrors()) {
return “CustomerForm”;
} else {
status.setComplete();
return “CustomerSuccess”;
}
}
其中, User 类定义为:
public class User {
private String name;
private String lastname;
private int age;
private Details details;
// Public Getters and Setters

}
Details 类定义为:
public class Details {
private boolean is_admin;
private int id;
private Date login_date;
// Public Getters and Setters

}

Recommendation
当使用提供自动模型绑定功能的框架时,最佳做法是控制要绑定到模型对象的属性,这样,即使攻击者能够
确定该模型或嵌套类的其他未暴露属性,他们也无法绑定 HTTP 请求参数的任意值。 根据所使用的框架,可
以采用不同的方法控制模型绑定过程: Spring MVC: 可以控制绑定过程中要使用和忽略的 HTTP 请求参
数。 在使用 @ModelAttribute 注释参数的 Spring MVC 应用程序中,可以配置绑定器以控制应绑定的属
性。 为此,可以对方法进行 @InitBinder 注释,以便框架注入对 Spring 模型绑定器的引用。可以配置
Spring 模型绑定器,以使用 setAllowedFields 和 setDisallowedFields 方法控制属性绑定过程。扩
展 BaseCommandController 的 Spring MVC 应用程序可以替代 initBinder(HttpServletRequest
request, ServletRequestDataBinder binder) 方法,以获取对 Spring 模型绑定器的引用。 示例 2
: 将 Spring 模型绑定器 (3.x) 配置为禁止绑定敏感属性:
final String[] DISALLOWED_FIELDS = new String[]{“details.role”, “details.age”,
“is_admin”};
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields(DISALLOWED_FIELDS);
}
示例 3: 将 Spring 模型绑定器 (2.x) 配置为禁止绑定敏感属性:
@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder
binder) throws Exception {
binder.setDisallowedFields(new String[]{“details.role”, “details.age”,
“is_admin”});
}
在使用 @RequestBody 注释参数的 Spring MVC 应用程序中,绑定过程由 HttpMessageConverter 实例
处理,这些实例使用 Jackson 和 JAXB 等库将 HTTP 请求正文转换为 Java 对象。这些库提供了注释来控制
应允许或禁止的字段。例如,对于 Jackson JSON 库,可以使用 @JsonIgnore 注释禁止将某个字段绑定到
请求。 示例 4: 某个控制器方法使用 @RequestBody 注释将 HTTP 请求绑定到 Employee 类实例。
@RequestMapping(value=“/add/employee”, method=RequestMethod.POST,
consumes=“text/html”)
public void addEmployee(@RequestBody Employee employee){
// Do something with the employee object.
}
应用程序使用默认的 Jackson HttpMessageConverter 将 JSON HTTP 请求绑定到 Employee 类。为了
禁止绑定 is_admin 敏感字段,使用了 @JsonIgnore 注释:
public class Employee {
@JsonIgnore
private boolean is_admin;

// Public Getters and Setters

}
注意: 有关如何配置 Jackson 和 JAXB 注释的更多详细信息,请查看下面的 REST 框架信息。 Apache
Struts: Struts 1 和 2 仅将 HTTP 请求参数绑定到具有关联的公共 setter 访问器的 Actions 或
ActionForms 属性。如果某个属性不应绑定到请求,则应将其 setter 设置为私有。 示例 5: 配置私有
setter 以便 Struts 框架不会自动绑定任何 HTTP 请求参数:
private String role;
private void setRole(String role) {
this.role = role;
}
REST 框架: 大多数 REST 框架会自动将内容类型为 JSON 或 XML 的 HTTP 请求正文绑定到模型对象。根据
用于 JSON 和 XML 处理的库,可以采用不同的方法控制绑定过程。以下是 JAXB (XML) 和 Jackson (JSON)
的一些示例: 示例 6: 使用 Oracle 的 JAXB 库从 XML 文档绑定的模型可以通过不同的注释控制绑定过程,
例如 @XmlAccessorType、 @XmlAttribute、 @XmlElement 和 @XmlTransient。可以告诉绑定器默认
不绑定任何属性,具体方法为:使用值为 XmlAccessType.NONE 的 @XmlAccessorType 注释对模型进行
注释,然后使用 @XmlAttribute 和 @XmlElement 注释选择应绑定的字段:
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class User {
private String role;
private String name;
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
示例 7: 使用 Jackson 库从 JSON 文档绑定的模型可以通过不同的注释控制绑定过程,例如 @JsonIgnore
、 @JsonIgnoreProperties、 @JsonIgnoreType 和 @JsonInclude。可以通过对某些属性进行
@JsonIgnore 注释,告诉绑定器忽略这些属性。
public class User {
@JsonIgnore
private String role;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
防止出现批量分配漏洞的另一方法是使用将 HTTP 请求参数绑定到 DTO 对象的分层体系结构。 DTO 对象仅
用于该目的,仅暴露 Web 表单或 API 合约中定义的属性,然后将这些 DTO 对象映射到域对象,在这里,可
以定义剩余的私有属性。

示例1,这种是针对get方式:
未处理前产生的问题
在这里插入图片描述
解决后如下
在这里插入图片描述
在这里插入图片描述
示例2,这种是针对@RequestBody这种:
未处理前产生的问题
在这里插入图片描述
解决后如下
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/240532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装Anaconda和pytorch

首先看下自己电脑是否有英伟达的显卡,如果有的话可以安装GPU版本,没有的话可以安装CPU版本。 CPU版本 1.安装Anaconda 首先去官网下载Anaconda。 点击download,下载的就是最新版本的。 下载完成后,直接运行下步就行 注意到路径…

Chrome更新

Chrome无法通过360软件管家升级,最方便的升级方法应该是通过Chrome本身进行升级,但可能需要自备梯子。 点击Chrome右上角三个点 点击帮助 点击关于Google Chrome 在弹出的页面中查看是否是最新版本,如果不是最新版本会有一个升级的按钮&a…

开题PPT答辩复盘

目录 总体思路加粗和红体字使用研究现状之后主要研究内容讨论 总体思路 分为五个部分,规定在10分钟以内讲完。这次开题答辩,主要是要讲清楚研究背景和意义,国内外研究现状。因此前两部分需要花大概6分钟重点解释,主要研究内容用2…

【Linux】进程周边003之进程优先级

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.基本概念 2.PRI与NI 3.利…

使用护眼台灯能不能有效预防近视?分享高品质的护眼台灯

在近几年,儿童青少年近视率非常高。很多家长认为孩子近视的原因是没有养成正确的用眼习惯,例如经常趴桌子写作业、眯眼看书等,但实际上这些坏习惯是因为没有合适的光线而导致的。所以安排一盏合适的台灯给孩子学习是非常重要的。 目前而言最好…

图片压缩软件4K Image Compressor Pro mac特点介绍

4K Image Compressor Pro mac是一款专业的图片压缩软件,它可以在不损失图像质量的前提下,优化图片文件的大小,从而节省存储空间,方便在社交媒体上共享图片,并优化网站加载速度。 4K Image Compressor Pro mac软件特点 …

29、Windows安全配置

文章目录 一、Windows安全配置简介二、账户策略2.1 密码策略2.2 账户锁定策略 三、本地策略3.1 用户权限分配 四、安全设置4.1 账户4.2 审核4.3 设备4.4交互式登录4.5 网络访问4.6 网络安全4.7 用户账户控制4.8 防火墙配置 五、高级审核策略设置5.1 账户登录5.2 账户管理5.3 对…

MDM主数据平台如何实现质量管控

当企业业务以及信息化建设发展到一定阶段后,都不可避免地要进行信息化和数据的治理工作,而主数据治理则是数据治理的基础。随着信息系统和业务的增加,系统打通与数据集成共享必然会成为企业信息化建设的瓶颈,而要实现系统集成&…

怪兽吃糖果

欢迎来到程序小院 怪兽吃糖果 玩法:左右飞出的糖果,点击鼠标糖果即为怪兽吃掉,不同的糖果不同的分数奖励, 吃不掉的糖果会扣除一次生命,共三次生命值,点击炸弹游戏结束,快去吃糖果吧^^开始游戏…

Pyhon基于YOLOV实现的车辆品牌及型号检测项目源码+模型+项目文档

项目运行运行录屏: Pyhon基于YOLOV实现的车辆品牌及型号检测项目运行录屏 完整代码下载地址:Pyhon基于YOLOV实现的车辆品牌及型号检测项目 项目背景: 车辆检测及型号识别广泛应用于物业,交通等的管理场景中。通过在停车场出入口…

在Spring Cloud中实现Feign声明式服务调用客户端

如果你学过Spring Cloud,你应该知道我们可以通过OpenFeign从一个服务中调用另一个服务,我们一般采用的方式就是定义一个Feign接口并使用FeignClient注解来进行标注,feign会默认为我们创建的接口生成一个代理对象。 当我们在代码中调用Feign接…

Leetcode143 重排链表

重排链表 题解1 线性表 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值,而是需要实际…

【Week P1】 MNIST手写数字识别

文章目录 一、环境配置1.1 安装环境1.2 设置环境,开始本文内容 二、准备数据三、搭建网络结构四、开始训练五、查看训练结果六、总结2.1 ⭐ torchvision.datasets.MNIST详解(Line4 & Line9)2.2 ⭐ torch.utils.data.DataLoader详解(Line4 & Line9)2.3 ⭐ sq…

C类核心论文复现:基于电力系统碳排放流理论的碳排放分摊模型研究程序代码!

本程序参考中文核心论文《基于电力系统碳排放流理论的碳排放分摊模型研究》,文中运用潮流追踪对系统网损引起的碳排放进行分配定量,最后得到系统实时碳排放的产权分配结果,程序较为简单和基础,具有较强的可扩展性和适用性&#xf…

路由器静态路由的配置

路由器静态路由的配置步骤如下: 进入系统视图。输入命令sys进入系统视图。配置路由器的接口IP地址。命令格式为int g0/0/0,其中g0/0/0表示路由器的接口,可以根据实际情况进行修改。然后使用命令ip add配置接口的IP地址。配置下一跳地址。在静…

【IDEA】IntelliJ IDEA创建一个Maven项目

在IDEA中创建Maven项目,前提是已经安装配置好Maven环境 。 本文主要使用的是IntelliJ IDEA 2022.2.1 (Community Edition) 1.创建一个新project:File>Project 2.修改Maven配置:File>Settings>搜索maven 创建好的工程如下: src/main…

应用在MiniLED电视领域中的MiniLED背光技术

众所周知,液晶技术发展至今仍旧无法避免自身的一些短板。随着消费升级等因素的影响,大家对于电视画质层面有了更高的需求与期待。所以在近的几年里,大厂们都在寻求能够替代LCD液晶的更优秀的显示技术。这其中,Mini LED势头惊人&am…

音乐制作软件Studio One mac软件特点

Studio One mac是一款专业的音乐制作软件,由美国PreSonus公司开发。该软件提供了全面的音频编辑和混音功能,包括录制、编曲、合成、采样等多种工具,可用于制作各种类型的音乐,如流行音乐、电子音乐、摇滚乐等。 Studio One mac软件…

iOS应用程序签名、重签名及安装测试优化指南

iOS应用程序的签名、重签名和安装测试 ipa编译出来后,或者ipa进行修改后,需要进行重新签名才能安装到测试手机,或者提交app store供apple 商店审核上架。ipaguard有签名和重签名功能,能在windows,mac,和li…

opencv cpp的安装

搞了半天, 可算弄好了. vs opencv cpp: https://blog.csdn.net/weixin_50918736/article/details/130176469?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-130176469-blog-127627204.235%5Ev39%5Epc_relev…