Как санировать HTML-код в Java, чтобы предотвратить атаки XSS? - PullRequest
22 голосов
/ 05 августа 2010

Я ищу класс / утилиту и т. Д. Для дезинфекции HTML-кода, т.е. удаления опасных тегов, атрибутов и значений, чтобы избежать XSS и подобных атак.

Я получаю HTML-код из текстового редактора (например, TinyMCE)но его можно отправлять злонамеренно, пропуская проверку TinyMCE («Данные, отправленные с сайта»).

Есть ли что-нибудь столь же простое в использовании, как InputFilter в PHP?Идеальное решение, которое я могу себе представить, работает следующим образом (предположим, что дезинфицирующее средство инкапсулировано в класс HtmlSanitizer):

String unsanitized = "...<...>...";           // some potentially 
                                              // dangerous html here on input

HtmlSanitizer sat = new HtmlSanitizer();      // sanitizer util class created

String sanitized = sat.sanitize(unsanitized); // voila - sanitized is safe...

Обновление - чем проще решение, тем лучше!Небольшой класс утилит с как можно меньшим количеством внешних зависимостей от других библиотек / фреймворков - лучше для меня.


Как насчет этого?

Ответы [ 5 ]

21 голосов
/ 04 августа 2015

Вы можете попробовать OWASP Java HTML Sanitizer . Это очень просто в использовании.

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

String safeHTML = policy.sanitize(untrustedHTML);
12 голосов
/ 05 августа 2010

Вы можете использовать OWASP ESAPI для Java , который представляет собой библиотеку безопасности, созданную для таких операций.

Мало того, что он имеет кодировщики для HTML, он такжеимеет кодировщики для выполнения кодирования JavaScript, CSS и URL. Примеры использования ESAPI можно найти в справочном листе по профилактике XSS, опубликованном OWASP.

Вы можете использовать проект OWASP AntiSamy , чтобы определить политику сайта, которая определяет, что разрешено в пользовательском контенте.Политика сайта может быть позже использована для получения «чистого» HTML, который отображается обратно.Вы можете найти образец файла политики TinyMCE на странице загрузок AntiSamy .

6 голосов
/ 01 августа 2013

HTML экранирование ввода работает очень хорошо. Но в некоторых случаях бизнес-правила могут требовать, чтобы вы НЕ экранировали HTML. Использование REGEX не подходит для этой задачи, и слишком сложно найти хорошее решение, используя его.

Лучшее решение, которое я нашел, было использовать: http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer

Он создает дерево DOM с предоставленным вводом и фильтрует любой элемент, ранее не разрешенный Белым списком. API также имеет другие функции для очистки HTML.

И его также можно использовать с javax.validation @SafeHtml (whitelistType =, AdditionalTags =)

4 голосов
/ 25 февраля 2016

Благодаря @ 1001 * ответу @ Saljack .Просто для более подробной информации о OWASP Java HTML Sanitizer .Это сработало очень быстро (быстро) для меня.Я просто добавил следующее в pom.xml в моем проекте Maven:

    <dependency>
        <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
        <artifactId>owasp-java-html-sanitizer</artifactId>
        <version>20150501.1</version>
    </dependency>

Проверьте здесь для последней версии.

Затем я добавил эту функцию для очистки:

    private String sanitizeHTML(String untrustedHTML){
        PolicyFactory policy = new HtmlPolicyBuilder()
            .allowAttributes("src").onElements("img")
            .allowAttributes("href").onElements("a")
            .allowStandardUrlProtocols()
            .allowElements(
            "a", "img"
            ).toFactory();

        return policy.sanitize(untrustedHTML); 
    }

Можно добавить дополнительные теги, расширив запятую в методе allowElements.

Просто добавьте эту строку перед передачей компонента для сохранения данных:

    bean.setHtml(sanitizeHTML(bean.getHtml()));

Вот и все!

Для более сложной логики эта библиотека очень гибкая и может обрабатывать более сложные реализации санации.

0 голосов
/ 23 февраля 2011

Относительно Антисами, вы можете проверить это относительно зависимостей:

http://code.google.com/p/owaspantisamy/issues/detail?id=95&can=1&q=redyetidave

...