Hibernate Validator的@SafeHtml来验证字符串有什么替代方案?

2022-09-02 10:20:32

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


答案 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

我的解决方案:

啪.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,第 II 部分(使用 Spring REST 进行验证)

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


推荐