在 Spring 中使用 setAllowedFields() 方法

2023-12-07

我正在使用 Spring 3.2.0。我已经注册了一些自定义属性编辑器以满足一些基本需求,如下所示。

import editors.DateTimeEditor;
import editors.StrictNumberFormatEditor;
import java.math.RoundingMode;
import java.net.URL;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import org.joda.time.DateTime;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.beans.propertyeditors.URLEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.context.request.WebRequest;

@ControllerAdvice
public final class GlobalDataBinder 
{
    @InitBinder
    public void initBinder(WebDataBinder binder, WebRequest request)
    {
        binder.setIgnoreInvalidFields(true);
        binder.setIgnoreUnknownFields(true);
        //binder.setAllowedFields(someArray);
        NumberFormat numberFormat=DecimalFormat.getInstance();
        numberFormat.setGroupingUsed(false);
        numberFormat.setMaximumFractionDigits(2);
        numberFormat.setRoundingMode(RoundingMode.HALF_UP);

        binder.registerCustomEditor(DateTime.class, new DateTimeEditor("MM/dd/yyyy HH:mm:ss", true));
        binder.registerCustomEditor(Double.class, new StrictNumberFormatEditor(Double.class, numberFormat, true));
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
        binder.registerCustomEditor(URL.class, new URLEditor());
    } 
}

到目前为止我已经注册了这么多编辑。他们两个人DateTimeEditor and StrictNumberFormatEditor已通过重写相应方法进行定制,以满足数字格式的自定义需求和乔达时间.

由于我使用的是 Spring 3.2.0,因此我可以利用@ControllerAdvice.

Spring 建议列出一组允许的字段setAllowedFields()方法,以便恶意用户无法将值注入绑定对象。

来自docs about DataBinder

允许将属性值设置到目标对象上的绑定器, 包括对验证和结合结果分析的支持。这 可以通过指定允许的字段来定制绑定过程, 必填字段、自定义编辑器等。

请注意,如果未能设置,可能会存在潜在的安全隐患 允许字段的数组。对于 HTTP 表单 POST 数据 例如,恶意客户端可以尝试通过以下方式破坏应用程序 为不存在的字段或属性提供值 形式。在某些情况下,这可能会导致非法数据被设置 命令对象或其嵌套对象。正因如此,高度 建议指定allowedFields财产在数据绑定器上。


我有一个很大的应用程序,显然有数千个字段。指定并列出所有这些setAllowedFields()是一项乏味的工作。此外,我需要以某种方式记住它们。

更改网页以删除某些字段或在需要再次出现时添加其他字段需要修改setAllowedFields()反映这些变化的方法。

有什么替代方案吗?


而不是使用setAllowedFields()要列入白名单,您可以使用setDisallowedFields()到黑名单。例如,来自 petclinic 示例应用程序:

@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
    dataBinder.setDisallowedFields("id");
}

从纯粹的安全角度来看,白名单优于黑名单,但它可能有助于减轻一些负担。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring 中使用 setAllowedFields() 方法 的相关文章

随机推荐

  • 递归是如何返回的?

    我正在努力更深入地理解递归 并且正在努力理解为什么它会这样工作 我知道这个函数返回前一个返回值的平方 2 4 16 256 等 但我想知道它是如何得到答案的 我对递归的理解是它迭代回到基本情况 但这让我相信它最终总是会返回基本情况 它是如何
  • 将大括号表达式替换为表达式中的一项

    这是一个示例字符串 three fifteen one hundred this is the first random number and this is the second two four 从括号中 我需要返回一个随机值 例如 O
  • PHP - spl_autoload 和命名空间 - 不适用于大写字母

    我在我的电脑中设置了一个非常基本的自动加载器index php获取其中的命名空间类hello php 我的开发环境是乌班图12 04 我为什么要尝试这样做 我正在努力坚持PSR 1 and PSR 2编码标准 包括了 类名必须在 Studl
  • IEnumerable 与 IQueryable

    我有一个疑问 topics OrderBy x gt x Replies Any x Replies OrderBy y gt y PostedDate Last PostedDate x PostedDate 它按最后回复对主题集合进行排
  • 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?

    我最近将 GCC 升级到 8 2 我的大部分 SFINAE 表达式都停止工作了 下面的内容有些简化 但说明了问题 include
  • 使用远程验证 asp.net MVC

    我喜欢尝试使用我在此链接上发现的远程验证 http www youtube com watch v Ll8VtDRj8L4 我已按照说明进行操作 并且有效 但问题是 当我尝试从引用表添加数据时 验证不起作用 型号类别 public part
  • 调用未定义的方法 Illuminate\Database\Query\Builder::save()?

    我在尝试保存模型后收到此错误 这是我收到的错误 调用未定义的方法 Illuminate Database Query Builder save 这是我的代码 public function getActivate code user Use
  • Flutter :- HTTP 文件发布示例:图像

    Future userPasswordUpdate async String passwordU password text String confirmPasswordU confirmPassword text String oldPa
  • Groovy:为具有属性集合的对象集合动态创建 XML

    我有一组具有属性的字段 每个属性都是单个值或对象的集合 可为 null 一个或多个 我需要为此创建一个类似 xml 的树 到目前为止 我发现的所有示例要么是静态的 要么是将映射转换为 xml 在循环中向 xml 添加节点的正确方法是什么 您
  • 根据第一列值合并两个索引数组的索引数组

    我有两个这样的数组 array1 10 Some Name 11 Some Name 13 Some Name array2 13 Viewed 如何在不循环的情况下合并这两个数组 有没有可用的 php 功能 我需要这样的输出 10 Som
  • 无法解析的外部符号,但 dumpbin 说没问题

    我下载了Crypto 5 62 并使用默认项目设置构建它 在我的项目中我设置了路径cryptopp lib并在 附加依赖项 中定义了它的名称 Crypto 和我的项目 VS 2008 在构建我的项目期间我得到 main obj error
  • Django 1.7 ImageField 表单验证

    我正在使用 Django 1 7 和 Python 3 4 编写单元测试 下面的表格可以很好地验证file data元素被注释掉 随着file data包括它不验证并且测试失败 from django core files uploaded
  • AppEngine 中任务队列的默认值是什么?

    假设我在我的队列中创建了一个新队列queue yaml文件为 queue name my queue 指定所有参数的等效队列是什么 这是我可以从docs so far queue name my queue mode push bucket
  • 计算次太阳点

    我刚刚开始使用PyEphem 我当前的任务是 给定日期和时间 计算地球上的亚太阳点latitude longitude价值观 我会深入研究PyEphem来解决这个问题 但如果有人已经这样做了 我会很感激示例代码 我去寻找与OP相同的答案 许
  • 如何在 pyspark 中启动 SparkSession

    我想更改 Spark 会话的默认内存 执行器和核心设置 Jupyter 中 HDInsight 集群上的 pyspark 笔记本中的第一个代码如下所示 from pyspark sql import SparkSession spark S
  • 将 glassfish javax.persistence 添加到 gradle 项目

    我收到这个错误 梯度构建 ant javac Hello java 2 错误 包 javax persistence 不存在 Hello java 2 导入 javax persistence 我应该添加到 gradle build 中以包
  • 在PowerShell中调用动态变量

    我正在尝试创建一个新变量 该变量将使用具有动态名称的其他变量作为其值 这就是我想做的 我有一个包含两个值的 System Array Years 2015 2016 另一个变量 Transactions有各种交易的清单 我尝试按以下方式使用
  • 黄瓜:自动创建步骤文件?

    当我运行黄瓜时它显示 我应该定义的可能步骤 RSpec 书中的一个示例 1 scenario 1 undefined 4 steps 4 undefined 0m0 001s You can implement step definitio
  • selenium.common.exceptions.SessionNotCreatedException:消息:会话未创建:此版本的 ChromeDriver 仅支持 Chrome 版本 114

    我收到以下错误 selenium common exceptions SessionNotCreatedException 消息 会话未创建 此版本的 ChromeDriver 仅支持 Chrome 版本 114 当前浏览器版本为 116
  • 在 Spring 中使用 setAllowedFields() 方法

    我正在使用 Spring 3 2 0 我已经注册了一些自定义属性编辑器以满足一些基本需求 如下所示 import editors DateTimeEditor import editors StrictNumberFormatEditor