2016-12-21 5 views
1

Я делаю проект для своей школы, и я хочу отладить все проблемы, обнаруженные с помощью вызова приложения HPE Fortify. Отчет генерируется приложением показывает только код ниже склонными к инъекции SQL:Является ли этот тип кода склонным к SQL-инъекции?

 String sql = " select Distinct p1.desc1,p2.desc2 from parameter p1" 
      +" inner join parameter p2" 
      +" on p1.ParaCode1='CR_DERIVE' and p1.ParaCode2=p2.Desc2" 
      +" inner join parameter p3" 
      + " on p2.ParaCode3=p3.ParaCode1 and p3.ParaCode3=p2.Desc2" 
      +" where p2.paracode1='ATTRIBUTE'" 
      + " and p2.ParaCode2='" + ddl_attribute.SelectedValue + "'"; 

Но не коды ниже:

strSQL = "SELECT Paracode2 FROM Parameter WHERE Paracode1 = 'PROGMGR' AND Desc1 = '" + login + "' AND Status = 'A' "; 

Я хотел бы знать, почему, как я неясно о SQL инъекции, и я новичок в этом. Спасибо за ответ

+3

Мое правило: если вы используете манипуляции со строками и а не параметры запроса, вы, вероятно, уязвимы. Просто используйте параметры запроса. –

+1

Оба они одинаково уязвимы. Приложение неверно. Просто следуйте одному правилу - * Не связывайте SQL, ** особенно с пользовательским вводом *** - и все будет в порядке. –

ответ

0

Вы объединяете некоторые переменные приложения в строку запроса 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

+0

Спасибо, что дали мне более глубокое руководство! Очень ценю это много :) –