XSS с динамическим вводом HTML

Моя команда устраняет уязвимости в старом приложении jsp. Проблема в том, что это позволяет пользователям (имеющим разрешение) создавать простую домашнюю страницу, помещая свой html в текстовую область и отображая его на странице. Проблема в xss проблемах. Я провел некоторое исследование и нашел на страницах jsp, которые я могу использовать:

fn:escapeXML() из библиотеки jstl, чтобы избежать любого введенного html/xml. Это нормально для ввода простых форм, но для создателя домашней страницы я хочу сохранить простой html, но избавиться от любых вредоносных скриптов или уязвимостей xss.

Мой товарищ по команде и я довольно новичок в исправлении проблем с xss и полагаемся на ресурсы, которые мы находим.

Я наткнулся на эти ресурсы и не уверен, что после прочтения они будут работать так, как мне нравится.

-Какую библиотеку очистки html использовать?

-https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

Если я использую owasp, очистит ли это html до базового рендеринга и предотвратит ли выполнение каких-либо сценариев?

Вот что у меня сейчас есть в jsp:

<td class='caption'>
  <c:set var="x"><%=system.getName()%></c:set>
  Options for ${fn:escapeXml(x)}
</td> 

Это работает и в настоящее время остановит запуск любого html/xml/script, но мне все же нужен базовый html (заголовки, абзацы, шрифты, цвета и т. д.) для простой информационной страницы с html.


person eaglei22    schedule 27.10.2014    source источник


Ответы (1)


Согласно OWASP

Если ваше приложение обрабатывает разметку — ненадежный ввод, который должен содержать HTML — проверить его может быть очень сложно. Кодирование также сложно, так как оно нарушит все теги, которые должны быть во входных данных. Поэтому вам нужна библиотека, которая может анализировать и очищать текст в формате HTML.

Существуют различные библиотеки очистки HTML. библиотека owasp-java-html-sanitizer, вероятно, является хорошей выбор.

Вы можете использовать предварительно упакованные правила:

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

настройте свою собственную политику :

PolicyFactory policy = new HtmlPolicyBuilder()
   .allowElements("a")
   .allowUrlProtocols("https")
   .allowAttributes("href").onElements("a")
   .requireRelNofollowOnLinks()
   .build();
String safeHTML = policy.sanitize(untrustedHTML);

или напишите пользовательские политики :

PolicyFactory policy = new HtmlPolicyBuilder()
    .allowElements("p")
    .allowElements(
        new ElementPolicy() {
          public String apply(String elementName, List<String> attrs) {
            attrs.add("class");
            attrs.add("header-" + elementName);
            return "div";
          }
        }, "h1", "h2", "h3", "h4", "h5", "h6"))
    .build();
String safeHTML = policy.sanitize(untrustedHTML); 

Полную информацию см. в документации. .

person Ortomala Lokni    schedule 28.03.2015