Hibernate Validator 的@SafeHtml 有哪些替代方法来验证字符串?

What alternatives are there to Hibernate Validator's @SafeHtml to validate Strings?

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

让我们首先解释一下弃用的原因:由于这个限制,我们最近遇到了一个安全问题 (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/ .

我的解决方案:

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 HTML and Sanitizing User Input, Part II (Validation with Spring REST)

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

这是 SafeHtml 的替代品。 您可以使用 Jsoup 并编写自定义注释来实现此目的。

首先在pom.xml

添加Jsoup依赖
<dependency>
   <groupId>org.jsoup</groupId>
   <artifactId>jsoup</artifactId>
   <version>1.8.2</version>
</dependency>

在这种方法中,我写这个是为了在字段级别进行验证,您甚至可以在 class 级别进行验证。 写下注释。

@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 {};
}

然后编写验证器class,你的验证逻辑在这里。

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;
}