【问题标题】:What alternatives are there to Hibernate Validator's @SafeHtml to validate Strings?Hibernate Validator 的@SafeHtml 有哪些替代方法来验证字符串?
【发布时间】:2019-11-18 11:19:51
【问题描述】:

如 JavaDocs 中所述,它将在未来的版本中删除。 是否有任何替代库可以通过注释类似地工作?

【问题讨论】:

    标签: java hibernate-validator


    【解决方案1】:

    让我们首先解释一下弃用的原因:由于这个限制,我们最近遇到了一个安全问题 (CVE)。这是由于我们的实现中的一个错误,但它让我们意识到这是非常脆弱的,并且在安全方面可能是一罐蠕虫。

    目前的替代方案是根据我们最新的实现自己实现它,并在您自己的应用程序中维护它(可能需要您自己的调整)。

    我们的博客上有一篇非常好的文章,解释了如何轻松做到这一点:https://in.relation.to/2017/03/02/adding-custom-constraint-definitions-via-the-java-service-loader/

    基本上,这种变化是我们说我们不想为可能很脆弱并且需要大量关注的东西承担责任,并且可能会针对部署它的应用程序平台进行调整。

    更新:我在这里发布了完整的公告:https://in.relation.to/2019/11/20/hibernate-validator-610-6018-released/

    【讨论】:

    【解决方案2】:

    这里是 SafeHtml 的替代方案。 您可以使用Jsoup 并编写自定义注解来实现这一点。

    首先在pom.xml中添加Jsoup依赖

    <dependency>
       <groupId>org.jsoup</groupId>
       <artifactId>jsoup</artifactId>
       <version>1.8.2</version>
    </dependency>
    

    在这种方法中,我编写此代码是为了在字段级别进行验证,您甚至可以在类级别进行验证。 如下写注解。

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = HTMLValidator.class)
    public @interface CustomSafeHtml {
       String message() default "Unsafe HTML tags included";
       Class<?>[] groups() default {};
       public abstract Class<? extends Payload>[] payload() default {};
    }
    

    然后编写验证器类,你的验证逻辑就到这里了。

    public class HTMLValidator implements ConstraintValidator<CustomSafeHtml,String 
    {
      @Override
      public void initialize(CustomSafeHtml constraintAnnotation) {
         ConstraintValidator.super.initialize(constraintAnnotation);
      }
    
      @Override
      public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return Jsoup.isValid(s, Whitelist.basic());
      }
    }
    

    最后将注释添加到您的必填字段。就我而言,我验证字符串字段。

    @Data
    public class VersionRequest extends BaseRequest {
      @CustomSafeHtml
      String version;
      EntityStatus status;
    }
    

    【讨论】:

    • 白名单现在被弃用,取而代之的是安全名单
    【解决方案3】:

    我的解决方案:

    pom.xml

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.14.2</version>
        </dependency>
    

    NoHtml.java

    @Documented
    @Constraint(validatedBy = NoHtmlValidator.class)
    @Target({METHOD, FIELD})
    @Retention(RUNTIME)
    public @interface NoHtml {
        String message() default "Unsafe html content";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    

    NoHtmlValidator.java

    public class NoHtmlValidator implements ConstraintValidator<NoHtml, String> {
        @Override
        public boolean isValid(String value, ConstraintValidatorContext ctx) {
            return value == null || Jsoup.isValid(value, Safelist.none());
        }
    }
    

    任何豆子:

    @NoHtml
    private String name;
    

    jsoup - Sanitize HTMLSanitizing User Input, Part II (Validation with Spring REST)

    更新:将 Jsoup.clean..equals.. 更改为 Jsoup.isValid

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多