有没有办法在使用 HtmlUtils.htmlEscape(String input) 时避免检查少数字符?

问题描述 投票:0回答:1

我有一个用例,我必须在服务器端防止 XSS 注入。所以我做了一个可以应用于字符串变量的自定义注释,并且在验证器逻辑中我使用了 HtmlUtils.htmlEscape(input) && Jsoup.clean(unsafe, Safelist.basic()).

public class Dto{
 
     @customXssPrevention
     String abc;
}

假设该注解的验证器类中的 isValid 方法已被覆盖。

@Override
public boolean isValid(String value, ConstraintValidatorContext cxt){
 
      //custom logic using HtmlUtils.htmlEscape(input) && Jsoup.clean(unsafe, Safelist.basic())

}

现在,假设我想允许某些字符,如单引号 ('),或某些标签,或此类输入。有没有一种方法可以排除在 HtmlUtils.htmlEscape 中对此类输入进行的检查?

基本上,我在想的是做一个像这样的注释:

@customXssPrevention(whitelist = {"<>","'"})

我认为应该有一个 HtmlUtils 应该公开的方法,它不会检查用户给出的几个字符,但我找不到任何这样的方法。很乐意贡献它所需要的。

截至目前,我正在修改用户输入并用随机字符替换此类白名单事件,然后将输入传递给 HtmlUtils.htmlEscape()。但绝对不是改变输入的好方法,相反我应该能够改变方法的行为或者 HtmlUtils 应该提供这样的方法。?

spring spring-mvc spring-security spring-aop
1个回答
0
投票

HtmlUtils 不提供排除某些字符或标签被转义的方法。但是,您可以通过实现自己的自定义转义函数来实现这一点,以满足您的特定需求。

以下是如何实现此目标的示例:

定义您自己的自定义转义函数,排除某些字符或标签:

public static String customEscape(String input, String[] whitelist) {
    String escaped = HtmlUtils.htmlEscape(input);
    for (String s : whitelist) {
        escaped = escaped.replaceAll(Pattern.quote(s), s);
    }
    return escaped;
}

在验证器逻辑中使用这个自定义转义函数:

@Override 
public boolean isValid(String value, ConstraintValidatorContext cxt){
  String[] whitelist = {"'", "<>", "<tag>"};
  String escapedValue = customEscape(value, whitelist);
  String cleanedValue = Jsoup.clean(escapedValue, Safelist.basic());
  return escapedValue.equals(cleanedValue);
}

请注意,在上面的示例中,我们使用正则表达式将出现的白名单字符/标签替换为实际字符/标签。您可以修改此实现以满足您的特定需求。

另外,请记住,虽然这种方法可能适用于简单的用例,但通常不建议在服务器端实施自定义 XSS 预防措施。相反,最好使用 OWASP ESAPI 或内容安全策略 (CSP) 等标准库来防止 XSS 攻击。

© www.soinside.com 2019 - 2024. All rights reserved.