2013-05-14 160 views
1

我想創建一個登錄頁面。我有一個名爲Login的數據庫表,它有兩列:ID和密碼。它有以下ID和密碼對:第一行:(13282,123456),第二行:(11111,11111)。如果用戶名和密碼正確,我將頁面重定向到succesful.aspx,如果用戶名或密碼錯誤,我將頁面重定向到unsuccesful.aspx。我的問題是,當我輸入13283作爲ID和123456作爲密碼時,它確實正確,我被重定向到成功的頁面。但是當我輸入ID = 11111和密碼= 11111即使一切都是真實的,它會重定向到不成功的頁面。我認爲問題是,我的查詢只檢查第一行。下面是代碼:驗證在asp.net數據庫中的用戶名和密碼

protected void loginButton_Click(object sender, EventArgs e) 
{ 

    SqlConnection con = new SqlConnection(); 
    con.ConnectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=University;Integrated Security=True;Pooling=False"; 


    Int32 verify; 
    string query1 = "Select count(*) from Login where ID='" + idBox.Text + "' and Password='" + passwordBox.Text + "' "; 
    SqlCommand cmd1 = new SqlCommand(query1, con); 
    con.Open(); 
    verify = Convert.ToInt32(cmd1.ExecuteScalar()); 
    con.Close(); 
    if (verify > 0) 
    { 
     Response.Redirect("succesful.aspx"); 
    } 
    else 
    { 
     Response.Redirect("unsuccesful.aspx",true); 
    } 

} 
+3

1)不要連接字符串來建立你的查詢。我個人喜歡密碼';從登錄中刪除;改用參數化查詢。 2)使用密碼然後散列它。切勿存儲明文密碼。 – 2013-05-14 00:08:57

+1

修剪用戶名和密碼空間(例如username.Trim())也是一個好主意。通常用戶複製/粘貼用戶名和密碼,並且不明顯他們複製了尾部空格。 – ptutt 2013-05-14 00:14:32

回答

3

有幾件事情是錯誤的這種方法:

  • 它需要採用明文存儲密碼 - 這是一個可以做用戶的密碼最糟糕的事情:任何人誰意外地獲得您的數據庫訪問權限將立即擁有所有用戶的密碼,非常非常糟糕。
  • 它容易受到SQL注入攻擊 - 連接字符串以產生SQL命令是危險的,因爲惡意用戶可能會輸入破壞SQL並將其變爲something else的字符串。

您應該研究this question的答案。這裏討論的方法並不像您正在實施的那樣簡單,但它們使您的系統更加防彈。

+0

謝謝,但實際上這是我第一次嘗試連接到數據庫並檢查用戶名 - 密碼對。我只是試圖實現這個權利:)而現在安全性並不重要。有關如何做到這一點的任何建議?或者任何解釋登錄頁面和用戶驗證的來源? – yrazlik 2013-05-14 00:26:49

+0

@bigO我能想到爲什麼你的查詢不起作用的唯一原因是'ID'和'Password'的數據類型是錯誤的(例如'char'而不是'varchar')。拋開兩個主要問題,查詢應該起作用。 – dasblinkenlight 2013-05-14 00:31:58

+0

哦,謝謝你,當我改變數據類型爲varchar它的工作。之前的問題是什麼,char和varchar有什麼區別? – yrazlik 2013-05-14 07:00:20

1
protected void btn_login_Click1(object sender, EventArgs e) 
{ 
     string user = txt_userid.Text; 
     string pass = txt_pwd.Text; 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand("select userid,password from tbllogin where [email protected] and [email protected]", conn); 
     cmd.Parameters.Add("user", @user); 
     cmd.Parameters.Add("pass", @pass); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 
     if (dt.Rows.Count > 0) 
     { 
      conn.Close(); 
      Response.Redirect("welcome.aspx"); 
     } 
     else 
     { 
      conn.Close(); 
      ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('Invalid Username and Password')</script>"); 
     } 
    } 
+0

這是一個正確的答案。所以給一個勾號,否則即使沒有人使用這個答案 – 2016-07-26 11:51:34