2017-04-15 22 views
0

私はユーザーを認証する簡単なWebサービスを作成しています。datatable.rows.countは常に0を返します

select文の結果を格納するために使用するdatatableを正しく埋め込むのに問題があります。 'dt.rows.count'(dtはデータテーブルの名前)は、select文が何も返さなくても常に0を返します。私はそれを満たす前にデータテーブルをクリアしようとしましたが、if条件の後にも、無駄に、私は同じ結果を得る。

進め方についてのアドバイスをいただければ幸いです。後および単一引用符の前にスペースを追加する

[WebMethod] 
    public string Authen(string a, string b) 
    { 
     var con = new SqlConnection("Data Source=SERVER-SQL;Initial Catalog=DECA-DB;Persist Security Info=True;User ID=sa;Password=*****"); 
     var sda = new SqlDataAdapter("SELECT * FROM Login_Matrix WHERE Username = ' " + a + " ' AND Password = ' " + b + " '", con); 
     var dt = new DataTable(); 

     con.Open(); 
     dt.Clear(); 
     sda.Fill(dt);    
     con.Close(); 
     int x = dt.Rows.Count; 
     //return (x); 

     if (x >0) 
     { 
      dt.Clear(); 
      return ("In"); 
     } 

     else 
     { 
      dt.Clear(); 
      return ("out"); 
     } 

     } 
    } 
+0

あなたは 'sqlconnection'が他の部分の後にあなたのSQL接続を閉じる – Sami

+0

閉じるように思えます。 – Mahi

答えて

2

(「スティーブ」など)inexistantユーザー名とpassordsのためのクエリの検索を行い、迅速な修正が可能性があり、それには、レコード

を返さない

var sda = new SqlDataAdapter(@"SELECT * FROM Login_Matrix 
           WHERE Username = '" + a + "' 
           AND Password = '" + b + "'", con); 

これは非常に危険です。
このコードはSql Injection attacksの脆弱性があります。
あなたはパラメータ

var sda = new SqlDataAdapter(@"SELECT * FROM Login_Matrix 
           WHERE Username = @uname 
           AND Password = @pwd", con); 
sda.SelectCommand.Parameters.Add("@uname", SqlDbType.NVarChar).Value = a; 
sda.SelectCommand.Parameters.Add("@pwd", SqlDbType.NVarChar).Value = b; 

とセキュリティについての同じ行に、他のものは、できるだけ早く検討するために使用する必要があり、データベース内のプレーンテキストのパスワードを格納することは本当に大きなセキュリティリスクであるということです。検索する必要があります how to salt and store an hash of the password

改善のため、このコードの他の部分もあります。

  • まずあなたは使い捨てのオブジェクトの接続やコマンドなどの 周りの文を使用して持っている必要があります。
  • 第2に、ユーザーが存在するかどうかを確認するために、完全なSqlDataAdapterと DataTableを持つ必要はありません。

だから、としてあなたのコードを書き換えることができます。

string cmdText = @"IF EXISTS(SELECT 1 FROM Login_Matrix 
        WHERE Username = @uname AND Password = @pwd) 
        SELECT 1 ELSE SELECT 0"; 

using(SqlConnection con = new SqlConnection(".....")) 
using(SqlCommand cmd = new SqlCommand(cmdText, con)) 
{ 
    con.Open(); 
    int result = (int)cmd.ExecuteScalar(); 
    return (result == 1 ? "In" : "out"); 
} 
+0

それは働きます。おねえさん:D –

関連する問題