2017-02-20 9 views
0

C#でのMySqlデータベースへの接続についていくつか質問があります。C#データベースへの接続とデータの安全な入力

私はこのチュートリアルのデータベースhttps://www.youtube.com/watch?v=IH0dYO8QOowに基づいてデータベースに接続しましたが、この種のアプローチはMySqlインジェクションには絶対に当てはまりません。 WAMP、

  • はそれがXAMPPでローカルホスト上のサーバーを作成する方が良い....またはMicrofost SQLをインストールします。私はPDOとPHPで働いている

    は今、私が知りたいのは、MySQLでのステートメントを準備しました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

    あなたはあなたのMySQLデータベースをセットアップするためにSQL Server Management Studioを使用しているのですか? –

    +0

    ''私はMySqlでPDO準備文を使ってPHPで作業しています " - 構文は異なりますが、概念は同じです。 *決して*ユーザー入力を直接SQLコードに連結しません。代わりにパラメータを使用します。これは、さまざまなプログラミング言語間で変更されません。 PHPが "prepared statement"と呼ぶもの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とパラメータを定義する3行の順序は入れ替え可能です。私のコードはあなたのdataAdapterを定義した場所を置き換えるためのもので、 'SqlConnection connection = new SqlConnection(@" Data Source =(LocalDB)\ MSSQLLocalDB; AttachDbFilename = C:\ Users \ Mario \ Documents \ mojaBaza1.mdf; Integrated Security = True; Connect Timeout = 30 ");'前に – Andrew

    +0

    ありがとう@Andrew、しかし、それは私が同じエラーが発生しているすべての時間が動作しません。私はVSとServerを再インストールしているかもしれません。 – Mario

    関連する問題