2012-01-08 19 views
-1

私はログインWebページを作成しようとしていますが、何らかの理由でログインとパスワードが正しくない "false"私はデータベースをチェックして、多分私がドゥシェだと見ていましたが、これは完全に真です。ユーザ名とパスワードが間違っていても、データベース内にあっても間違っています

これは私のコードです:ヘルパーのための

con = new SqlConnection("Data Source=MICROSOF-58B8A5\\SQL_SERVER_R2;Initial Catalog=Daniel;Integrated Security=True"); 
string query = "SELECT Username, Password FROM Users WHERE Username='" + Username + "' AND Password='" + Password + "'"; 
con.Open(); 
DataSet ds = new DataSet(); 
SqlDataAdapter adap = new SqlDataAdapter(query, con); 
adap.Fill(ds); 
int count = ds.Tables[0].Rows.Count; 
if (count == 0) 
{ 
    ErrorMessege.Text = "Username or Password was Incorrect!"; 
} 
else 
{ 
    Session["Session"] = UsernameLogin.Text; 
    Response.Redirect("MenuHome.aspx"); 
} 
con.Close(); 

ありがとう!

+5

'SqlParameter'sを使用して、UserNameとPasswordの値をクエリに渡します。あなたの現在の実装はSQLインジェクションを求めています! (例えば、ユーザー名として 'x 'と1 = 1 - 'を入力し、何が起こるかを確認するためにパスワードのランダムな値を入力してみてください) – GolfWolf

+1

組み込みのasp.net SQLメンバーシップ・プロバイダを使用しないのはなぜですか? –

+3

私はユーザー 'x'になりたいと思います; DROP TABLE Users; ' – spender

答えて

2

コードが正常に動作するように見えます。あなたはそれを踏んで、どのような価値があるかを見るためにdsに時計を追加しましたか?自分のマシンのコードをテスト用データベースの1つに対して実行したところ、正常に動作しました。それは私の意見では、多くのクリーナーであると私はしかし、これにsimilair何かを示唆している

using(SqlConnection con = new SqlConnection("Data Source=MICROSOF-58B8A5\\SQL_SERVER_R2;Initial Catalog=Daniel;Integrated Security=True")) 
{ 
    string query = "SELECT TOP 1 Username FROM Users WHERE [email protected] AND [email protected]"; 

    using (SqlCommand command = new SqlCommand(query, con)) 
    { 
     command.Parameters.AddWithValue("@UserName", UserName); 
     command.Parameters.AddWithValue("@Password", Password); 
     con.Open(); 
     string username = (string)command.ExecuteScalar(); //Add Null Check 
     // Do stuff if username exists   
    } 
} 

をあなたはいつもIDisposableインターを実装するオブジェクト上のusingステートメントを追加する必要があります(SqlConnectionオブジェクト、SqlCommandオブジェクト)も。 SqlInjectionなどを防ぐには、パラメータ化されたクエリを使用します。チェックする

+2

彼はまだパスワード記憶装置を修正する必要があります。 sql-injectionを修正しましたが、プレーンテキストのパスワードは保存しませんでした。 – CodesInChaos

0

パスワードをチェックする最も簡単な方法は、クエリ文字列をResponse.Writeをし、結果を貼り付けしようとしたことがあり、単に

SqlCommand sqlCommand = new SqlCommand(queryString, connection); 
var reader = sqlCommand.ExecuteDataReader(); 
if(reader.Read()){ 
//you got a correct password, read fields from reader 
    string username = reader[0]; 
} 

ExecuteReader SqlDataReader

0

から作成されたSqlDataReaderのを作成することですデータベースエクスプローラの新しいクエリ?驚くかもしれません:)

0

ユーザー名とパスワードの検証で大文字と小文字が区別されないか、大文字と小文字の区別が正しいことを確認してください。 DBが大文字小文字を区別する照合を使用する場合、期待どおりの結果を返さないことがあります。

+0

私はそれがデータベースのように書かれていることを保証しました。 – thormayer

0

いくつかのこと:あなたが送信されたユーザ名/パスワードの値の

  1. 場合(上/下)。おそらく大文字と小文字の区別がないため、何も一致しません。

  2. あなたは... ...一般的にパスワードを暗号化して保存されますテキスト形式でパスワードを保存しているので、私はあなただけ

    SELECTユーザー名、ユーザーからパスワード低く(ユーザー名のようなユーザー名を検索することをお勧め)= 'ユーザー名';

+0

Nitpick:あなたはパスワードを暗号化せず、ハッシュします。 – CodesInChaos

+0

うん...ちょうどそれを置き忘れた。 – Rahul

関連する問題