2016-12-30 4 views
2

このSQL注入証明はありますか?少なくとも、大丈夫ですか?私はこれをオンラインで手に入れましたので、本当に助けを得ることができました。私は現在かなりのプログラムを構築しており、支払いをしたいと思ったらログインページを追加することにしました。助けてください!私のコードはSQLインジェクションプルーフですか?

if (txt_UserName.Text == "" || txt_Password.Text == "") 
{ 
    MessageBox.Show("Please provide a Username and Password"); 
    return; 
} 

try 
{ 
    // Create SqlConnection 
    SqlConnection con = new SqlConnection(cs); 

    SqlCommand cmd = new SqlCommand("Select * from tbl_Login where UserName = @username and Password = @password", con); 

    cmd.Parameters.AddWithValue("@username", txt_UserName.Text); 
    cmd.Parameters.AddWithValue("@password", txt_Password.Text); 

    con.Open(); 

    SqlDataAdapter adapt = new SqlDataAdapter(cmd); 
    DataSet ds = new DataSet(); 
    adapt.Fill(ds); 

    con.Close(); 

    int count = ds.Tables[0].Rows.Count; 

    // If count is equal to 1, than show frmMain form 
    if (count == 1) 
+0

そうではありません。準備されたステートメントを使用する必要があります。それについては、SqlConnectorのドキュメントを参照してください。私は携帯電話に乗っているので、今すぐ完全な回答を投稿することはできません。 – SplittyDev

+1

@SplittyDev準備されたステートメントは、これと比較してどのような保護を提供しますか?それはちょうど同じですが、準備ができています。この場合は役に立たないかもしれません。 –

+0

注:この種のクエリにDataSetを使用することは非常に悪いことです。彼らは遅く、メモリが空いていて、単に 'DataReader'を使うほうが良いでしょう。 –

答えて

3

あなたのコードはSQLインジェクションプルーフです。 プレーンSQLクエリについては、私は個人的にはStackOverflowで使用されているDapper ORMを使いたいと思っています。

これは基本的には同じですが、コードの数が少なく、DataSetの代わりに強く型付けされた値を返します。例えば

public class User 
{ 
    public string UserName { get; set; } 
    public string Password { get; set; } 
} 

User user; 
using (IDbConnection cnn = new SqlConnection(cs)) 
{ 
    user = cnn.Query<User>(
     "Select UserName, Password from tbl_Login where [email protected] and [email protected]", 
     new { username = txt_UserName.Text, password = txt_Password.Text }) 
     .SingleOrDefault(); 
} 

if (user != null) 
{ 
    // Do someting 
} 

FYI:あなたが普通のパスワードを格納しているようです。もしそうなら、それは良い習慣ではありません。代わりに、ソルトされたハッシュ・パスワードを保管したいとします。

+0

これらはハッシュされています。私はそのコードを含んでいませんでした – RockyBoa

+0

これが事実ならば、あなたはすべて設定され、行きたいです。 – Win

関連する問題