Как исправить XSS-уязвимости

Мы используем fortify для сканирования исходного кода Java, и он жалуется на следующую ошибку:

Method abc() sends unvalidated data to a web browser on line 200, which can result in the browser executing malicious code.

Ниже приведен код в строке 200:

<a href="<%= Util.getProduct(request) %>">Product</a>

И код Util.java ниже в методе getProduct:

String prod = request.getParameter("prod");

Может ли кто-нибудь сказать мне, как исправить эту уязвимость XSS?

Спасибо!


person Mike    schedule 10.11.2011    source источник


Ответы (2)


Вам нужно избежать вывода Util.getProduct(request). Обычно это делается с помощью JSTL, тега <c:out> и EL:

<a href="<c:out value="${Util.getProduct(request)}"/>" class="left_nav_link">Product</a>

N.B. вам придется использовать довольно современную реализацию EL (согласно JSTL или JSP 2.0 EL для получения с аргументом и Параметры в методах EL), чтобы передать аргумент методу получения.


Поскольку код в вашем вопросе содержит скриптлеты, я настоятельно предлагаю вам прочитать Как избежать кода Java в файлах JSP? Этот вопрос касается причин использования JSTL+EL вместо скриптлетов, а также немного информации о том, что эти на самом деле относятся две аббревиатуры.

person Matt Ball    schedule 10.11.2011
comment
есть типа после запроса)} дополнительный закрывающий уголок? - person Mike; 10.11.2011
comment
А, нет, извините, мне действительно не хватало открытого <, см. Правку. - person Matt Ball; 10.11.2011
comment
Когда я добавил %@ taglib uri=java.sun.com/jsp/jstl/core prefix=c %› вверху, я получаю много ошибок, в которых говорится, что acordong to tld или директива атрибута в файле тега, значение атрибута не принимает никаких выражений .... есть подсказка? - person Mike; 10.11.2011
comment
c:out не помогает предотвратить XSS для href значений; он экранирует определенные специальные символы в XML в предопределенные объекты. Чтобы предотвратить XSS, вам необходимо сочетание экранирования URL и проверки через значения href - person Vineet Reynolds; 10.11.2011
comment
@Vineet, ты совершенно прав, я действительно не думал, когда отвечал прошлой ночью. Вы должны опубликовать свой собственный ответ или, по крайней мере, отредактировать мой (если первый, я просто удалю свой). - person Matt Ball; 10.11.2011
comment
@ MДΓΓ БДLL, на самом деле это не решает проблему, заключающуюся в том, что злоумышленник может ввести что-то вредоносное в качестве строки продукта в URL-адресе, и что код Майка отразит это обратно в браузере. Это правда, что стиль программирования Майка прост в плане инкапсуляции, но настоящая проблема заключается в межсайтовом скриптинге, уязвимости системы безопасности. c:out, вероятно, будет HTML-кодировать строку в HTML-атрибут, что, вероятно, даже неправильно. - person Douglas Held; 20.01.2012

Если у вас нет JSTL для этого веб-сайта, вы можете решить проблему, убедившись, что вы печатаете только действительные продукты:

public String getProduct( String prod ) throws InputValidationException {
    if (   prod.equals( "myProduct1" )
        || prod.equals( "myProduct2" )
        || prod.equals( "myProduct3" )
        // etc.           
    ) {
        return "/foo/page.jsp?product=" + safeProduct;
    }
    else {
        throw new InputValidationException( "Invalid product key provided." );
    }
}
person Douglas Held    schedule 20.01.2012