Вы объединяете некоторые переменные приложения в строку запроса SQL, поэтому безопасность зависит от того, как были установлены значения этих переменных. Пришли ли они из некоторых ненадежных материалов? Или они были установлены из некоторых безопасных данных приложения?
Если HPE Fortify проанализировал ваш код и знает, как переменной login
было присвоено его значение, оно может сообщить, что оно безопасно использовать в выражении SQL. Принимая во внимание, что это не может сделать такой вывод о переменной SelectedValue
, поэтому предполагается, что она небезопасна и поэтому может вызвать уязвимость SQL.
Язык Perl делает что-то подобное, без использования инструмента, такого как HPE Fortify. Каждая переменная Perl либо «испорчена», либо «незавинчена» в зависимости от того, где она получила свое значение. Таким образом, вы можете определить, безопасна ли переменная в SQL, или в eval() или других возможных ситуациях инъекции кода. Жаль, что больше языков не поддерживают нечто подобное.
Но я согласен с другими комментаторами в том, что вы должны научиться использовать параметры запроса. Это легко и безопасно. И вы можете перестать анализировать глаза, если вы правильно сбалансировали свои кавычки внутри кавычек.
Ваш образец кода выглядит так, как будто это Java. Вот пример в Java:
strSQL = "SELECT Paracode2 FROM Parameter"
+ " WHERE Paracode1 = 'PROGMGR' AND Desc1 = ? AND Status = 'A' ";
Обратите внимание на ?
заполнителем для параметра не имеет одинарные кавычки вокруг него в пределах строки SQL. Вы не должны помещать SQL-цитаты вокруг заполнителя.
PreparedStatement stmt = con.PreparedStatement(sql);
stmt.setString(1, login);
ResultSet rs = stmt.executeQuery();
Для получения дополнительной информации, чтобы помочь вам понять, SQL инъекции, вы могли бы мое выступление SQL Injection Myths and Fallacies или видео меня поставляя, что говорить: https://www.youtube.com/watch?v=VldxqTejybk
Мое правило: если вы используете манипуляции со строками и а не параметры запроса, вы, вероятно, уязвимы. Просто используйте параметры запроса. –
Оба они одинаково уязвимы. Приложение неверно. Просто следуйте одному правилу - * Не связывайте SQL, ** особенно с пользовательским вводом *** - и все будет в порядке. –