2014-11-12 3 views
0

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

protected string UserInfo() 
{ 
    string UsrName = User.Identity.Name; 

    using (SqlConnection connection = new SqlConnection(Common.ConnectionString)) 
    { 
     UserDetail det = new UserDetail(); 

     using (SqlCommand cmd = new SqlCommand("select [email protected],[email protected],[email protected],[email protected] from Users,OtherInfo where OTID = USERID AND [email protected]")) 
     { 
      cmd.Parameters.AddWithValue("UserName", UsrName); // Works correctly for this 
      cmd.Parameters.AddWithValue("@fn" det.FirstName); 
      cmd.Parameters.AddWithValue("@ln" det.FirstName); 
      cmd.Parameters.AddWithValue("@mn" det.FirstName); 
      cmd.Parameters.AddWithValue("@ea" det.FirstName); 
      cmd.Connection = connection; 
      connection.Open(); 
      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       reader.Read(); 
       info.FirstName = reader["FirstName"].ToString(); 
       info.LastName = reader["LastName"].ToString(); 
       info.TelNum = reader["MobileNumber"].ToString(); 
       info.Email = reader["EmailAddress"].ToString(); 
      } 
     } 
    } 
} 

UserDetail My обладает следующими свойствами:

public string FirstName { get; set; } 
public string LastName { get; set; } 
public string Email { get; set; } 
public string TelNum { get; set; } 

Но это только кажется, вернуться null значения? Кто-нибудь знает, где я ошибаюсь?

ответ

2

Я думаю, вы не хотели передавать пустые значения из вашего объекта UserDetail. Вы эффективно передаете значения null от UserDetail в качестве значения для столбцов, которые выводит ваш запрос.

Попробуйте удалить параметры в select части, удалить их из команды, и попробуйте еще раз:

using (SqlCommand cmd = new SqlCommand("select FirstName,LastName,MobileNumber,EmailAddress from Users,OtherInfo where OTID = USERID AND [email protected]")) 
{ 
    cmd.Parameters.AddWithValue("UserName", UsrName); // Works correctly for this 
    cmd.Connection = connection; 
    connection.Open(); 

    using (SqlDataReader reader = cmd.ExecuteReader()) 
    { 
     if (reader.Read()) 
     { 
      info.FirstName = reader["FirstName"].ToString(); 
      info.LastName = reader["LastName"].ToString(); 
      info.TelNum = reader["MobileNumber"].ToString(); 
      info.Email = reader["EmailAddress"].ToString(); 
     } 
    } 
} 
+0

Разве это не делает запрос уязвимыми для SQL инъекций? – Code

+1

№. Поля поступают из базы данных, которая является безопасной. Вам нужно только беспокоиться о том, что происходит (например, 'UserName' в вашем коде), а не о том. –

+1

Спасибо за ответ и дальнейший совет по sql-инъекции :) – Code

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