2016-09-14 10 views
0

Я делаю вызов LDAP, в котором мне нужно использовать строку, введенную пользователем в фильтр LDAP. Я очистил данные, удалив из строки все не буквенно-цифровые символы.Trick/Обходное решение HP Fortify LDAP Injection Finding

public static String alphanumericOnly(String input) { 
    return input == null ? "" : input.replaceAll("\\W|_", ""); 
} 

Однако, HP Fortify флаги обмена как уязвимости LDAP инъекций, даже если я сделал свою должную осмотрительность, чтобы убедиться, что нет метасимволы LDAP такие, что инъекция атака LDAP может быть выполнена.

Я ищу способ обмануть HP Fortify, чтобы он не отображал это взаимодействие.

Я заметил в других применениях HP Fortify, что, если мой ввод строки является целым числом, я могу проанализировать его как int (BigInteger в этом случае), а затем я могу использовать его в строке, а HP Fortify будет игнорировать его при проверке журнала ковке:

BigInteger id = new BigInteger(ValueChecker.numericOnly(request.getID())); 
logger.info(id + " - Request Received."); 

Кажется мне, что там может быть такой же способ обмануть HP Fortify в игнорировании проблемы впрыска LDAP, так как я уже проверил достоверность данных.

простые обходные пути я пытался не работал:

  • преобразование строки в массив символов, а затем обратно в строку

  • ввода каждого символа в массив байтов, а затем преобразование обратно в строку

  • литья строку в объект, а затем обратно в строку

Я не собираюсь скрывать или подавлять выводы Fortify. Я хочу обмануть/усовершенствовать Fortify, чтобы они не были отмечены вообще.

Любые идеи?

ответ

0

Я понял. Это может быть сделано путем преобразования String в массив int кодовых точек и последующего его преобразования. Это обеспечивает достаточную косвенность, чтобы обмануть Fortify, и проблема не будет отмечена.

public static String scrub(String input) { 

    // remove all non-alphanumeric characters 
    String sanitized = alphanumericOnly(input); 

    // trick Fortify by storing chars 
    // as codepoints in an int array 
    int[] codepoints = new int[sanitized.length()]; 

    for(int i = 0; i < sanitized.length(); ++i) { 
     codepoints[i] = sanitized.codePointAt(i); 
    } 

    return new String(codepoints, 0, codepoints.length); 
} 
+0

Это звучит скорее как ошибка в Fortify, и вы все еще уязвимы. Почему бы просто не устранить эту уязвимость? – AviD