当前位置: 首页 > 知识库问答 >
问题:

使用Hibernate Validator(JSR303)对其他框架(ESAPI、Apache Commons等)进行输入验证

殷宾白
2023-03-14

我研究了各种输入验证框架,包括用于JSR303 bean验证的Hibernate Validator impl,以及ESAPI Validator接口及其DefaultValidator实现。

ESAPI输入验证围绕通过ESAPI.properties文件进行的regex模式匹配。

ESAPI路由:

esapi.properties:

Validator.SafeString=[A-Za-z0-9]{0,1024}$

Java班:

ESAPI.validator().isValidInput("Name","darthvader", "SafeString", 255, false)

Hibernate验证器/spring MVC路由

Hibernate涉及使用各种约束注释(@NotNull、@Size、@Min、@Pattern和@Valid等)来注释bean。并集成spring MVC用于验证规则。

@RequestMapping(value = "/appointments", method = RequestMethod.POST)
public String add(@Valid User user, BindingResult result) {
    ....
}

似乎使用Hibernate validator/spring MVC提供了类似的功能和regex匹配等,使用ESAPI库比使用Hibernate validator API有什么优势吗?可能是SQL注入/XSS或任何类似性质的东西?针对ESAPI输入验证框架的XSS/SQL注入的安全性?任何真正的优势比使用一个或另一个。提前道谢。

回答我自己的问题:我想我为这个职位找到了自己的解决方案。使用Hibernate/spring MVC允许非常健壮的bean验证功能。并且Hibernate提供了诸如@safeHTML、@pattern等安全注释。基本上,我们可以设置一组复合注释来提供bean验证。http://docs.jboss.org/hibernate/validator/5.0/reference/en-us/html_single/

共有2个答案

庾鸿飞
2023-03-14

仅供参考,我基于Hibernate Validator创建了一组专用于输入验证的注释:

https://github.com/righttod/hibernate-validator-security-contribs

希望这能有所帮助:)

魏彦
2023-03-14

与Hibernate验证器API相比,使用ESAPI库有什么优势吗?

我是一个安全专家,所以我要说的第一件事是,在担心输入验证之前,确保在担心安全级别的输入验证之前,在后端有上下文转义到一个科学。如果数据要进入数据库,请确保您为查询(或准备好的语句或存储的过程)转义它,并且在处理该数据时,正确地转义它,以便将其发送到下游web服务/命令行/etc或将该数据重新呈现给用户(HTML/JavaScript/ActionScript/etc)

现在,我已经排除了必须的部分,这两个库用于非常不同的事情。ESAPI的一个主要设计目标是,它的设计目的是帮助保护那些从一开始就被设计成没有安全机制的应用程序的安全。例如,它预先打包了用于SQL注入的数据编码技术,由于复杂性/时间限制/等原因,这些技术可能不能立即重写为参数化查询或存储过程。但是,Hibernate是作为一个JPA实现设计的(如您所指出的),对JSR规范的引用将对Hibernate的实现产生一些启示:

验证数据是一项常见的任务,在整个应用程序中,从表示层到持久层都有。通常在每一层中实现相同的验证逻辑,这证明是耗时和容易出错的。为了避免在每一层中重复这些验证,开发人员经常将验证逻辑直接捆绑到域模型中,用验证代码(实际上是关于类本身的元数据)来杂乱地处理域类。

这显然是为了处理域层验证,我偷偷地怀疑Hibernate确实在应用程序的错误层提供了一些方便的方法--可能是一个糟糕的应用程序设计将域对象从Dao层一直传递到表示层。您不应该在您的域模型中清理或打赌可能的HTML。您应该在最初从HttpRequest对象中提取数据的控制器/服务层进行pung操作。一旦数据被验证,将数据转换为一个域对象,然后将其传递到后端。此外,即使使用Hibernate@safeHTML也不能保护您免受javascript攻击,如果数据是合法的javascript而不是合法的HTML。这就是为什么输出转义比输入过滤重要100倍的原因。

回答你的第一个问题:

与Hibernate验证器API相比,使用ESAPI库有什么优势吗?

  1. 首先,Hibernate中的“@SafeHTML”不是JSR303规范的一部分,因此通过使用它,您可以将JPA实现直接绑定到Hibernate。这会损害维护。
  2. ESAPI的验证器为您提供了通过validator.properties更改验证的能力,这意味着您可以在生产中处理业务问题,而不必像当前在批注驱动模型中所发生的那样进入开发阶段来创建一个全新的构建。
  3. ESAPI的验证器是由安全专家设计、编写和测试的。
  4. 这是最重要的一点:ESAPI为您提供了ESAPI.encoder().canonicalize()方法,该方法在ESAPI的任何validator.getValidHTML(args...)调用中隐式使用。此方法本身允许您确定是否有人正在尝试对您的应用程序进行多重编码攻击。类似的调用在我所知道的任何其他Java安全库中都不存在,在Hibernate的验证器实现中肯定不存在--而且我绝不会期望Hibernate会有这个调用,因为它是一个域库。

ESAPI确实有一个主要缺点。2014年秋季,由于社区发展停滞不前,它失去了OWASP的旗舰地位。用ESAPI3.0是否开始了,时间会告诉我们。

 类似资料:
  • 这个页面无疑是最难编写的,但我们认为它也是非常重要的。或许你曾遇到了一些问题并且已经用其他的框架解决了。你来这里的目的是看看 Vue 是否有更好的解决方案。这也是我们在此想要回答的。 客观来说,作为核心团队成员,显然我们会更偏爱 Vue,认为对于某些问题来讲用 Vue 解决会更好。如果没有这点信念,我们也就不会整天为此忙活了。但是在此,我们想尽可能地公平和准确地来描述一切。其他的框架也有显著的优点

  • 首先要明确一点的是,没有最好,只有最合适。前端框架并不是所谓 注:本文一些数据收集时间为16-12-31 因为大部分教程都是付费的,所以教程数量的多少在侧面反映了框架的市场需求,如果框架冷门用的人不多,那必然不会有人去为其开发教程。

  • 请原谅我在这里缺乏理解,因为我已经进入了三天的冬眠期。 我正在尝试在一个实体上添加验证,这需要将它们与另一个实体进行比较。 例如,以一个人为例。一个人可以有许多身体部位,但最多有两个手臂类型的身体部位(变异除外)。为了验证这一点,在插入新的车身部件时,我需要将其与给定人员的其他车身部件进行比较,并验证该类型的最大值是否已经达到。 我一直在研究Hibernate提供的约束/验证内容,但似乎没有一个涵

  • 我正在使用IBM沃森助手,并尝试根据时间帧/跨度验证用户输入。我应该使用什么功能? 我正在使用方法来验证用户输入的过去和现在之间的时间框架,但它现在对我有效。如果我现在或今天输入沃森助手仍然认为这是过去... : 看起来“好像你以前想预约。再试一次。”正确的 我预计,如果用户现在或今天的输入可以使预订生效,如果用户输入过去的时间来响应 “就像你过去想预订一样。再试一次。” 所讨论的代码片段如下所示

  • 我在服务器端对JSON进行了编码(使用ESAPI编码器),然后客户机检索bean的字段并进行进一步的处理。 在服务器端 编码的JSON字符串 \x7b\x22name\x22\x3a\x22sameer\x22,\x22company\x22\x3a\x22company\x22,\x22designation\x22\x3a\x22developer\x22\x7d 在客户端

  • 样本数据 我使用AJV 6.10.0来验证我的数据,但我认为我有一个错误的模式定义。带Ajv选项: 实际上,我有6个错误,警告每个属性的其他属性 在验证allOf(姓名和电话)中的第一个对象时,验证在(地址、邮政编码、城市和州)中发现错误 如果我删除了第一个allOf对象(姓名、电话)的附加属性,在验证地址架构的过程中,验证会在(姓名和电话)上发现错误 如何解决模式定义