Экранировать html, за исключением некоторых специальных символов

С целью предотвращения внедрения html-кода и межсайтового скриптинга для сервисных запросов создан фильтр для экранирования некоторых символов с помощью: StringEscapeUtils.escapeHtml(text)

Однако это также экранирует некоторые символы UTF8, такие как äöü. Использование excludeList и преобразование этих значений в их хэш-код перед вызовом StringEscapeUtils.escapeHtml и обратное преобразование хэш-значений в строки после этого вызова решает проблему. Но это не очень элегантное решение!

    String[] excludeList = {"ü", "Ü", "ö", "Ö", "ä", "Ä", "ß"};

    private static String escapeHtml(String text, String[] exclusionList) {
    TreeMap<Integer, String> excludeTempMap = new TreeMap<Integer, String>();

    //replace characters from exclusionList in the text with their equivalent hashCode
    for(String excludePart : exclusionList) {
        Matcher matcher = Pattern.compile(excludePart, Pattern.MULTILINE).matcher(text);

        while(matcher.find()) {
            String match = matcher.group();
            Integer matchHash = match.hashCode();

            text = matcher.replaceFirst(String.valueOf(matchHash));

            excludeTempMap.put(matchHash, match);

            matcher.reset(text);
        }
    }

    //escape malicious html characters
    text = StringEscapeUtils.escapeHtml(text);

    //replace back characters from exclusionList from hash values to string
    for(Map.Entry<Integer, String> excludeEntry : excludeTempMap.entrySet()) {
        text = text.replaceAll(
            String.valueOf(excludeEntry.getKey()),
            excludeEntry.getValue()
        );
    }

    return text;
}

Есть ли у кого-нибудь совет, как добиться этого с помощью лучшего решения? Является ли их лучшей библиотекой, которую можно использовать для внесения в белый список некоторых символов, специфичных для языка?


person orcl user    schedule 28.07.2021    source источник