Подтвердить что ты не робот

Как очистить HTML-код на Java, чтобы предотвратить атаки XSS?

Я ищу класс/утилиту и т.д. для дезинфекции 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...

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


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

4b9b3361

Ответ 1

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

Он не только имеет кодировщики для HTML, но также имеет кодировщики для кодирования JavaScript, CSS и URL. Примеры использования ESAPI можно найти в брошюре по предотвращению XSS, опубликованной OWASP. Забастовкa >

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

Ответ 2

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

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

String safeHTML = policy.sanitize(untrustedHTML);

Ответ 3

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

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

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

И он также может быть использован с javax.validation @SafeHtml (whitelistType =, дополнительныйTags =)

Ответ 4

Спасибо @Saljack answer. Просто для более подробного описания 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 off, чтобы сохранить данные:

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

Что это!

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