У меня есть веб-приложение, построенное на JSF с MySQL в качестве БД. Я уже реализовал код для предотвращения CSRF в моем приложении.
Поскольку моя основная структура - это JSF, я полагаю, что мне не нужно обрабатывать XSS-атаку, поскольку она уже обрабатывается UIComponent
. Я не использую JavaScript ни на одной из страниц просмотра. Даже если я использую, действительно ли мне нужно реализовать код для предотвращения XSS-атак?
Для БД мы используем подготовленные операторы и хранимые процедуры во всех взаимодействиях с БД.
Есть ли что-нибудь еще, что нужно сделать для предотвращения этих трех распространенных атак? Я уже прошел через сайт OWASP и их шпаргалки .
Нужно ли мне заботиться о других потенциальных векторах атаки?
При использовании <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) по умолчанию не санировали ввод данных пользователем.