2016-11-01 1 views
-3

Итак, я сделал форму, где вы входите в систему из БД. Код должен быть понятным.Хорошая профилактика от инъекции MYSQL?

private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string MyConnection = "datasource=localhost;port=3306;username=root;password=xdmemes123"; 
     MySqlConnection myConn = new MySqlConnection(MyConnection); 
     MySqlCommand SelectCommand = new MySqlCommand("select * from life.players where DBname='" + this.username.Text + "' and DBpass='" + this.password.Text +"' ; ", myConn); 
     MySqlDataReader myReader; 
     myConn.Open(); 
     myReader = SelectCommand.ExecuteReader(); 
     int count = 0; 
     while (myReader.Read()) 
     { 
      count = count + 1; 
     } 
     if (count == 1) 
     { 
      Properties.Settings.Default.Security = "Secure"; 
      Properties.Settings.Default.AdminName = username.Text; 
      Properties.Settings.Default.AdminPass = password.Text; 
      Properties.Settings.Default.Save(); 
      MessageBox.Show("Logged in"); 
      this.Hide(); 
      Form2 f2 = new Form2(); 
      f2.ShowDialog(); 
     } 
     else if (count > 1) 
     { 
      Properties.Settings.Default.Security = "Insecure"; 
      MessageBox.Show("Incorrect!"); 
     } 
     else 
     { 
      Properties.Settings.Default.Security = "Insecure"; 
      MessageBox.Show("Incorrect!"); 
      myConn.Close(); 
     } 
} 
    catch (Exception ex) 
    { 
     MessageBox.Show("Something went wrong. Error copied to clipboard."); 
     Clipboard.SetText(ex.Message); 
    } 
} 

Но мой вопрос в том, что это безопасно от инъекций MYSQL? А если нет, что я могу сделать, чтобы сделать его безопасным?

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

+3

Нет, это не безопасно от SQL инъекций. Идите читать, и вы сразу увидите, почему. – DavidG

+1

Именно так внедрена уязвимость SQL-инъекций! – pid

+0

'this.username.Text ==" 0 '; удалить из некоторых таблиц - "' –

ответ

1

код уязвим для инъекций SQL, на самом деле, это идеальный пример - конкатенация и SELECT * позволит злоумышленнику вводить, например, паролем x' OR 1=1;# и получить все имена пользователей и пароли в незашифрованном виде. Даже ненужный цикл для подсчета результатов приведет к заметной задержке, которая сообщит злоумышленнику, которого он добился.

Следующий код не уязвим для инъекций, хотя это NOT правильный способ аутентификации паролей. Он предназначен только для демонстрации. Обратите внимание, что не использование SELECT *, только SELECT count(*):

//Reuse the same command with different connections 
void InitializePlayerCmd() 
{ 
    var query = "SELECT COUNT(*) FROM life.players where [email protected] and [email protected]"; 
    var myCmd= new MySqlCommand(query); 
    myCmd.Parameters.Add("@name", SqlDbType.VarChar,30); 
    myCmd.Parameters.Add("@pass", SqlDbType.VarChar,200); 
    _playerCheckCmd=myCmd; 
} 

//..... 
int CheckPlayer(string someUserName, string someAlreadyHashedString) 
{ 
    var connectionString=Properties.Settings.Default.MyConnectionString; 
    using(var myConn= new MySqlConnection(connectionString)) 
    { 
     _playerCheckCmd.Connection=myConn; 
     _playerCheckCmd.Parameters["@name"].Value=someUserName; 
     _playerCheckCmd.Parameters["@pass"].Value=someAlreadyHashedString; 
     myConn.Open(); 
     var result=_playerCheckCmd.ExecuteScalar(); 
     return result; 
    } 
} 
3

Вы можете использовать Parameters.Add как встроенный текст позволяет происходить инъекции, пример лучше SQL является:

using (var conn = new SqlConnection(@"datasource=localhost;port=3306;username=root;password=xdmemes123")) 
{ 
    conn.Open(); 
    var command = new SqlCommand("", conn); 
    command.CommandText = "select * from life.players where DBname='@sqlName' and DBpass='@sqlPass"; 
    command.Parameters.Add("@sqlName", SqlDbType.VarChar).Value = this.username.Text;   
    command.Parameters.Add("@sqlPass", SqlDbType.VarChar).Value = this.password.Text; 
    using (SqlDataReader myReader = command.ExecuteReader()) 
    { 
     while (myReader.Read()) 
     { 
      string value = myReader["COLUMN NAME"].ToString(); 
     } 
    }  
} 

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

+1

Нет, нет, нет, нет! [Никогда не использовать 'AddWithValue'] (http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/) – DavidG

+0

Мне сказали, что это будет Хорошо? Используйте только Add, вы говорите? – FakeCaleb

+0

Прочтите ссылку, я не буду повторять, что она говорит. – DavidG