2014-04-30 24 views
1

我的註冊應用程序似乎在我運行SQL注入時,任何人對我有任何快速修復建議,我真的不想改變一切,但爲了使它能夠運行我的第一個項目更新。我的WinForm得到一個SQL注入

string constring = "datasource=127.0.0.1;port=3306;username=root;password=welcome"; 
     string Query = "insert into userdatabase.users (userid, email, passone, passtwo, lastname, firstname) values('" + this.userid_txt.Text + "','" + this.email_txt.Text + "','" + this.passone_txt.Text + "','" + this.passtwo_txt.Text + "','" + this.lastname_txt.Text + "','" + this.firstname_txt.Text + "') ;"; 
     MySqlConnection conDataBase = new MySqlConnection(constring); 
     MySqlCommand cmdDataBase = new MySqlCommand(Query, conDataBase); 
     MySqlDataReader myReader; 
     try 
      { 
       conDataBase.Open(); 
       myReader = cmdDataBase.ExecuteReader(); 
       MessageBox.Show("Welcome to iDSTEM!"); 
       while (myReader.Read()) 
      { 

       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

該錯誤提示:

你在我的SQL語法錯誤;檢查手冊...第1行

+2

是,該代碼是容易SQL注入(對於任何涉及撇號的東西都只是一個很好的老式失敗)。所以解決。什麼是問題? –

+0

此代碼的哪些部分導致SQL注入我研究的所有內容都涉及單個'標記,它們不會影響結果 – Bendlino

+0

http://stackoverflow.com/a/3216248/2186023 – DrCopyPaste

回答

3

序檢查近視「userdatabase」語法,以避免注射必須使用參數,e.g:

string constring = "datasource=127.0.0.1;port=3306;username=root;password=welcome"; 
string Query = "insert into userdatabase.users (userid, email, passone, passtwo, lastname, firstname) values(@par1,@par2,@par3,@par4,par5,@par6)"; 

    MySqlConnection conDataBase = new MySqlConnection(constring); 
    MySqlCommand cmd = new MySqlCommand(Query, conDataBase); 
    cmd.Parameters.AddWithValue("@par1",this.userid_txt.Text) 
    cmd.Parameters.AddWithValue("@par2",this.email_txt.Text) 
    cmd.Parameters.AddWithValue("@par3",this.passone_txt.Text) 
    cmd.Parameters.AddWithValue("@par4",this.passtwo_txt.Text) 
    cmd.Parameters.AddWithValue("@par5",this.lastname_txt.Text) 
    cmd.Parameters.AddWithValue("@par6",this.firstname_txt.Text) 

    try 
     { 
      conDataBase.Open(); 
      //Execute command 
      cmd.ExecuteNonQuery(); ///I suppose no need to use datareader...since you make insert 
      MessageBox.Show("Welcome to iDSTEM!"); 

    catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
+0

謝謝,保存我打字它。我還建議顯示OP如何修改SQL語句本身以包含參數。 – Liath

+0

乘以6和像「小巧玲瓏」的工具開始看**真**開胃! –

+0

試一試,謝謝您的建議 – Bendlino

1

「修復」這裏是參數。至於捷徑:如果數據庫提供者支持命名參數,dapper可以提供幫助。我不使用MySQL的,所以我不能肯定地說,但如果我們想象是,MySQL支持使用@前綴參數名稱,然後命名參數:

// uses "dapper" (search for "Dapper" on NuGet/Package Manager) 
connection.Execute(
@"insert into userdatabase.users 
     (userid, email, passone, passtwo, lastname, firstname) 
values(@userid, @email, @passone, @passtwo, @lastname, @firstname)", 
    new { userid = this.userid_txt.Text, 
      email = this.email_txt.Text, 
      passone = this.passone_txt.Text, 
      passtwo = this.passtwo_txt.Text, 
      lastname = this.lastname_txt.Text, 
      firstname = this.firstname_txt.Text}); 
+0

我以前沒見過這種方法 - 很好! – Liath

+0

Marc,我唯一不能做的就是連接'在當前上下文中不存在',我必須在上面的某個地方調用這個連接嗎? – Bendlino

+0

@ user3581876你已經有一個連接 - 它被稱爲'conDataBase'。 Execute方法通過「dapper」 –