Springboot ReqeustBody 输入验证 HTML 元素

Springboot ReqeustBody input Validation for HTML elements

提问人:remya thekkuvettil 提问时间:9/8/2023 更新时间:9/8/2023 访问量:106

问:

我正在寻找一种方法来验证 Springboot 应用程序中 HTML 内容的请求正文字段,如下所示

{
    "name": "<img src=x onerror=alert(1)>",
    "value": "<img src=x onerror=alert(1)>"
}

我知道我可以使用javax.validation中的@Pattern(regexp = “[a-zA-Z]*”, message = “Name can only have letters”)。(在不同的用例中,我可能需要添加不同的复杂正则表达式来满足许多请求正文字段)。 有没有其他方法可以阻止Springboot中的HTML元素?

Java Spring-Boot 验证 请求

评论


答:

0赞 ayoub 9/8/2023 #1

仅使用正则表达式不足以阻止 Html 元素,因此,您可以使用一些库作为 OWASP java html 清理程序来删除潜在的危险内容。

  1. 添加依赖:

    <!-- https://mvnrepository.com/artifact/com.googlecode.owasp-java-html-sanitizer/owasp-java-html-sanitizer -->
    <dependency>
        <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
        <artifactId>owasp-java-html-sanitizer</artifactId>
        <version>20220608.1</version>
    </dependency>
    
  2. 创建用于验证的批注

    @Documented 
    @Constraint(validatedBy = HtmlSanitizerValidator.class) 
    @Target({ElementType.FIELD, ElementType.PARAMETER}) 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface SanitizeHtml { 
        String message() default "not allowed!!"; 
        Class<?>[] groups() default {}; 
        Class<? extends Payload>[] payload() default {}; 
    }
    
  3. 为注释创建验证程序

    public class HtmlSanitizerValidator implements ConstraintValidator<SanitizeHtml, String> { 
        @Override 
        public boolean isValid(String untrustedHTML, ConstraintValidatorContext context) {
            if (untrustedHTML == null) { return true; }
    
            PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS);
            String safeHTML = policy.sanitize(untrustedHTML);
    
            return untrustedHTML.equals(safeHTML); //if true, this means there is no HTML content, but false means there have been an attack!! 
        } 
    }
    
  4. 为您的字段使用注释:

    public class yourDto { 
        @SanitizeHtml 
        private String name; 
    
        @SanitizeHtml 
        private String value; 
    }
    

希望这对你有所帮助!

铌: 只要确保如果你想在你的safeHTML中允许Html标签,但要确保它显示为纯文本而不执行任何有害的代码,你可以使用它(注意依赖关系):

String safeHTML = Encode.forHtml(untrustedHTML)

而不是:

PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS);
String safeHTML = policy.sanitize(untrustedHTML); 

这是 Github 存储库,用于更多: https://github.com/OWASP/java-html-sanitizer