2017-02-20 70 views
0

我有幾個關於連接到C#中的MySql數據庫的問題。C#連接數據庫和安全輸入數據

我作出數據庫的連接基於本教程YouTube上https://www.youtube.com/watch?v=IH0dYO8QOow但我在評論readed波紋管視頻是這種做法是vunearable到MySql注射。

我PHP中的PDO工作準備語句在MySQL中,現在我想知道:

  • 是最好把自己與XAMPP,WAMP本地主機服務器....或安裝Microfost的Sql服務器
  • 如何使查詢-S和預處理語句在C#和如何使它安全

我使用Microsoft SQL Server 2014創建數據庫。

請不要給我一個負面的分數,因爲我是新來的C#和想學習,我聽說這是最好的地方問一個問題,並得到適當的幫助。

這裏是簡單登錄表單的代碼,連接到數據庫並檢查有效的用戶名和密碼,如果一切正常,它會打開新窗口並隱藏登錄表單。

using System; 
using System.Data; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace WindowsFormsApp1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      // connect to a database 
      SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Mario\Documents\mojaBaza1.mdf;Integrated Security=True;Connect Timeout=30"); 

      // make new query 
      SqlDataAdapter sda = new SqlDataAdapter("SELECT COUNT(*) FROM users WHERE username = '" + textBox1.Text + "' AND password = '" + maskedTextBox1.Text + "'",connection); 

      // fetch data from table 
      DataTable dt = new DataTable(); 

      sda.Fill(dt); 

      // check query for result, if returned 1 login 
      if (dt.Rows[0][0].ToString() == "1") 
      { 
       // hides new window 
       this.Hide(); 

       // instance of new window when user log in 
       Main ss = new Main(); 

       // show new window 
       ss.Show(); 
      } 
      else 
      { 
       // error message if user entered invalid data 
       MessageBox.Show("Invalid username or password, please try again."); 
      } 

     } 
    } 
} 
+0

是的,這是很容易受到SQL注入,因爲您正在使用文本框中的直接輸入。改用參數化查詢。 – Andrew

+0

你的意思是你使用SQL Server Management Studio來設置你的MySQL數據庫嗎? –

+0

'「我在PHP中使用PDO在MySql中準備語句」 - 語法不同,但概念相同。 *永遠不會*直接連接用戶輸入到SQL代碼。改用參數。這在不同的編程語言之間不會改變。 PHP可能調用「準備語句」C#可能改爲調用「參數化查詢」。 – David

回答

0

試試這個:

SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Mario\Documents\mojaBaza1.mdf;Integrated Security=True;Connect Timeout=30"); 
SqlCommand cmd= connection.CreateCommand(); 
cmd.CommandText="SELECT COUNT(*) FROM users WHERE [email protected] AND [email protected]"; 
cmd.parameters.AddWithValue("@username",textBox1.Text); 
cmd.parameters.AddWithValue("@password",maskedTextBox1.Text); 
SqlDataAdapter sda = new SqlDataAdapter(cmd); 

您使用的參數爲您的查詢,這是相當多一份準備好的聲明的C#版本這樣。

+0

我試過你的代碼,我得到「連接」變量http://prntscr.com/ebabfi錯誤,並且不需要在查詢本身之前定義參數,或者它是如何這是c#處理它? – Mario

+0

@Mario'cmd.parameters.AddWithValue()'是你如何定義參數,三行定義CommandText和參數的順序是可以互換的。我的代碼只是替換你定義dataAdapter的位置,你仍然需要'SqlConnection connection = new SqlConnection(@「Data Source =(LocalDB)\ MSSQLLocalDB; AttachDbFilename = C:\ Users \ Mario \ Documents \ mojaBaza1.mdf;集成安全性= True;連接超時= 30「);'在它之前 – Andrew

+0

謝謝你@安德魯,但是這並不總是有效,我得到同樣的錯誤。我正在重新安裝VS和服務器,也許這是他們的問題。 – Mario