Предотвращение атак CSRF, XSS и SQL-инъекций в JSF

У меня есть веб-приложение, построенное на JSF с MySQL в качестве БД. Я уже реализовал код для предотвращения CSRF в моем приложении.

Поскольку моя основная структура - это JSF, я полагаю, что мне не нужно обрабатывать XSS-атаку, поскольку она уже обрабатывается UIComponent . Я не использую JavaScript ни на одной из страниц просмотра. Даже если я использую, действительно ли мне нужно реализовать код для предотвращения XSS-атак?

Для БД мы используем подготовленные операторы и хранимые процедуры во всех взаимодействиях с БД.

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

Нужно ли мне заботиться о других потенциальных векторах атаки?

54
задан Antti Haapala 23 July 2016 в 22:07
поделиться

1 ответ

При использовании <h:outputText escape="false"> с незавершенными значениями (например, прибывающий от редакторов текста HTML) Вы открыты для противных нападений XSS. В таких случаях я использую преобразователь JSF, который использует Jsoup для удаления JavaScript из текста, оставляя HTML неповрежденным. Преобразователь может использоваться для очистки вводов данных пользователем также. Можно использовать его как это:

<h:outputText value="{bean.value}" escape="false" converter="htmlSanitizingConverter"/>

И сам преобразователь:

/**
 * Prevents from XSS attack if output text is not escaped.
 */
@FacesConverter("htmlSanitizingConverter")
public class HtmlSanitizingConverter implements Converter {

    private static final Whitelist JSOUP_WHITELIST = Whitelist.relaxed()
            .preserveRelativeLinks(true)
            .addAttributes(":all","style");
            /*
             Optionally - add support for hyperlinks and base64 encoded images.
            .addTags("img")
            .addAttributes("img", "height", "src", "width")
            .addAttributes("a", "href")
            .addProtocols("img", "src", "http", "https", "data");
            */

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
        return (submittedValue != null) ? Jsoup.clean(submittedValue, JSOUP_WHITELIST) : null;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return (value != null) ? Jsoup.clean(value.toString(), JSOUP_WHITELIST) : "";
    }

}

Примечание: Когда Вы используете JSF с PrimeFaces, остерегаетесь <p:textEditor> - , более старые версии (до 6,2) по умолчанию не санировали ввод данных пользователем.

0
ответ дан 7 November 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: