2016-03-01 1 views
1

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

Я тестирую некоторый код C# MySQL, и я, когда правильные учетные данные были отправлены в базу данных, программа возвращает значение 1, что означает правильность.

Однако, если значения проверяются, которые не соответствуют результаты, которые я получаю исключение:

Необработанное исключение типа «System.FormatException» произошло в Server.exe Дополнительная информация: Входная строка не была в правильный формат.

public int CheckLoginCredentials(String username,string password) 
    { 
     string query = "SELECT * from testTable.user WHERE username='" + username + "' and password='" + password + "'"; 
     int Count = -1; 

     //Open Connection 
     if (this.OpenConnection() == true) 
     { 
      //Create Mysql Command 
      MySqlCommand cmd = new MySqlCommand(query, connection); 

      //ExecuteScalar will return one value 
      try 
      { 
       Count = int.Parse(cmd.ExecuteScalar() + ""); 

      } 
      catch (Exception e) 
      { 

       throw e; 
      } 
      //close Connection 
      this.CloseConnection(); 

      return Count; 
     } 
     else 
     { 
      return Count; 
     } 
    } 

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

ответ

2

Здесь вы должны использовать SELECT Count(*);

ExecuteScalar будет Выполняет запрос и возвращает первый столбец первой строки в наборе результатов, возвращаемого запросом. Дополнительные столбцы или строки игнорируются.

И еще одно общее предложение; Используйте параметризованные запросы, чтобы избежать SqlInjection; поэтому Команда Определение будет выглядеть следующим образом:

 string query = "SELECT COUNT(*) from testTable.user WHERE [email protected] and [email protected]"; 
     MySqlCommand cmd = new MySqlCommand(query, connection); 
     cmd.Parameters.AddWithValue("@username", username); 
     cmd.Parameters.AddWithValue("@password", password); 

Теперь команда готова к исполнению. Как предположил MSDN, ExecuteScalar() вернет object, который нам нужно преобразовать в целое число, но в этом случае count() всегда будет возвращать целочисленное значение (0, если результат равен нулю). Следовательно, вывод cmd.ExecuteScalar() будет boxed integer. так что выполнение запроса будет выглядеть следующим образом:

int Count = Convert.ToInt32(cmd.ExecuteScalar()); 
+0

Кроме того, изменить код следующим образом: 'Count = (Int32) cmd.ExecuteScalar();' – Rob

+0

Вам не нужно 'ToString()', а затем проанализируйте строку .. это потеряно работа. Результат - это целое число в штучной упаковке, вам просто нужно указать на int, как указано выше: – Rob

+0

@Rob: спасибо за новую информацию. –

Смежные вопросы