我有一个用例,我必须在服务器端防止 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 应该提供这样的方法。?
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 攻击。