Неправильная нейтрализация последовательностей CRLF («внедрение CRLF») в Mailadress в JAVA

Этот код:

    InternetAddress[] myAdrs = getAdrs(message.getToAddresses());
    for (int i = 0; i < myAdrs.length; i++) {
        String s = myAdrs[i].getAddress();
        s = s.replace("\r","").replace("\n","").replace("%0A","").replace("%0a","").replace("%0D","").replace("%0d","");
        InternetAddress adr = new InternetAddress( s, false );
        // --> Improper Neutralization of CRLF Sequences ('CRLF Injection') (CWE ID 93)
        lMessage.addRecipient(Message.RecipientType.TO, adr);
    }

по-прежнему дает мне CWE ID 93, хотя я удалил все ненужные строки в s с помощью s=s.replace(\r.... В примерах, которые я нашел в Интернете, s=s.replace должен быть решением, но все же у меня есть этот недостаток?Что мне не хватает?Любые подсказки будут очень признательны!


person Dan    schedule 28.11.2017    source источник
comment
Последние версии JavaMail должны защищать от внедрения CRLF в адреса. Вы проверили это, чтобы определить, что инъекция CRLF действительно возможна? Или это просто ложное срабатывание какого-то инструмента статического анализа?   -  person Bill Shannon    schedule 28.11.2017
comment
Спасибо за ответ. Да, я думаю, что это ложное срабатывание, так как я не могу вставить InternetAdress[] с crlf. Да и вообще - если бы они были, я бы убрал их в коде.... То есть все должно быть нормально? Но так как клиент видит этот отчет, было бы очень хорошо, чтобы этот недостаток был устранен! Любой намек, как избавиться от этого недостатка определенно?   -  person Dan    schedule 30.11.2017
comment
Без понятия. Какой инструмент вы используете для обнаружения этих недостатков? Может быть, его правила основаны на старых версиях JavaMail?   -  person Bill Shannon    schedule 01.12.2017


Ответы (1)


Я сталкивался с такими ситуациями, когда Veracode не принимает самодельные решения вроде использования StringEscapeUtils и простых методов замены. Попробуйте библиотеку ESAPI. Veracode обычно принимает ESAPI как надежный инструмент для устранения уязвимостей. Например:

//need to handle ValidationException
String s = ESAPI.validator().getValidInput("User Email", myAdrs[i].getAddress(), "Email", 255, true);
InternetAddress adr = new InternetAddress( s, false );

И поместите регулярное выражение для проверки вашей электронной почты в файл validation.properties (или другой файл, который вы укажете в файле ESAPI.properties как Validator.ConfigurationFile=validation.properties) как свойство Validation.Email. Например:

Validator.Email=^[A-Za-z0-9._%'-]+@[A-Za-z0-9.-]+\\.[a-zA-Z]{2,6}$
person Vitaliy Borisok    schedule 05.12.2017