2013-10-05 58 views
1

如果我輸入正確的ID我都低於這個簡單的登錄頁面,無法顯示「錯誤PW」

+ PW - >成功(我想)

如果我輸錯ID

- >錯誤登錄(我想要)

但是,如果我輸入正確的ID +錯誤的ID,我希望它說錯了密碼。

我該怎麼辦?

謝謝。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

using System.Data.SqlClient; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Session["X"] != null) 
     { 
      Response.Redirect("MemberPage.aspx"); 
     } 
    } 

    SqlConnection cnn = new SqlConnection("Initial Catalog=Northwind;Data Source=localhost;Integrated Security=SSPI;"); 

    protected void Button1_Click(object sender, EventArgs e) 
    { 

     cnn.Open(); 
     SqlCommand cmd = new SqlCommand("SELECT FirstName,LastName FROM Employees", cnn); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     if (dr.HasRows) 
     { 
      while (dr.Read()) 
      { 
       if (TextBox1.Text == dr.GetString(0) || TextBox2.Text == dr.GetString(1)) 
        { 
          Session["x"] = TextBox1.Text; 
          Response.Redirect("MemberPage.aspx"); 
        } 
       else 
       { 
        Label2.Text = "wrong login"; 
       } 
      } 
     } 

     cnn.Close(); 

    } 
    protected void Button2_Click(object sender, EventArgs e) 
    { 
     Response.Redirect("Register.aspx"); 
    } 
} 
+0

您的Employees表中記錄了多少用戶?如果您有多個用戶註冊,則此代碼存在嚴重問題 – Steve

+2

您應該**從不顯示任何消息,如「錯誤的密碼」或「錯誤的用戶名」。始終給出一個模糊的錯誤消息,說明用戶名或密碼錯誤。否則,你會向攻擊者提供用戶名正確的提示,而你永遠不應該這樣做。 –

+0

@ LasseV.Karlsen謝謝。 –

回答

2

雖然這不能回答你的問題,我看到你的邏輯主要的安全缺陷。我認爲無論您的用戶遇到什麼故障,用戶名無效或密碼無效,都應該始終顯示相同的「無效登錄」消息。

如果您有人試圖闖入系統,一旦您驗證用戶帳戶存在(無效密碼),他們就可以開始使用蠻力破解該特定帳戶的密碼。

只是想一想。

+0

感謝您的建議。 –

+0

+1爲安全邏輯。還有一件事。您不能分辨u/p是否不正確,因爲可能有多個用戶使用相同的密碼。 – jmoreno

0

你在這裏錯誤地把你的邏輯。邏輯將是

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data.SqlClient; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Session["X"] != null) 
     { 
      Response.Redirect("MemberPage.aspx"); 
     } 
    } 

    SqlConnection cnn = new SqlConnection("Initial Catalog=Northwind;Data Source=localhost;Integrated Security=SSPI;"); 

    protected void Button1_Click(object sender, EventArgs e) 
    { 

     cnn.Open(); 
     SqlCommand cmd = new SqlCommand("SELECT FirstName,LastName FROM Employees", cnn); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     if (dr.HasRows) 
     { 

       if (TextBox1.Text.Trim() == dr.GetString(0) || TextBox2.Text.Trim()== dr.GetString(1)) 
        { 
         if (TextBox2.Text.Trim()== dr.GetString(1)) 
         { 
          Session["x"] = TextBox1.Text.Trim(); 
          Response.Redirect("MemberPage.aspx"); 
         } 
         else 
         { 
          Label2.Text = "wrong password"; 
         } 
        } 
       else 
       { 
        Label2.Text = "wrong login"; 
       } 

     } 

     cnn.Close(); 

    } 
    protected void Button2_Click(object sender, EventArgs e) 
    { 
     Response.Redirect("Register.aspx"); 
    } 
} 
0

您從數據庫中讀取姓氏和姓氏,但是根據姓氏檢查密碼。我懷疑這個字段包含有效的密碼

這個邏輯錯誤的一部分,你應該在你的語句中使用WHERE子句來檢查用戶是否存在於數據庫中。

protected void Button1_Click(object sender, EventArgs e) 
{ 
    // Command with parameters that check if a user with the supplied credentials exists 
    // If the user exists then just one record is returned from the datatable.... 
    string cmdText = "SELECT FirstName,LastName " + 
        "FROM Employees " + 
        "WHERE [email protected] and [email protected]"; 
    using(SqlConnection cnn = new SqlConnection(.....)) 
    using(SqlCommand cmd = new SqlCommand(cmdText, cnn)) 
    { 
     cnn.Open(); 
     cmd.Parameters.AddWithValue("@uname", TextBox1.Text); 
     cmd.Parameters.AddWithValue("@pwd", TextBox2.Text); 
     using(SqlDataReader reader = cmd.ExecuteReader()) 
     { 
       // If the Read returns true then a user with the supplied credentials exists 
       // Only one record is returned, not the whole table and you don't need to 
       // compare every record against the text in the input boxes 
       if(reader.Read()) 
       { 
        Session["x"] = reader.GetString(0); 
        Response.Redirect("MemberPage.aspx"); 
       } 
       else 
       { 
        Label2.Text = "Invalid credentials"; 
       } 
     } 
    } 
} 

還有一點需要注意的是以下幾點。在數據庫中,您不應該有明文形式的密碼。存儲密碼的正確方法是存儲與密碼對應的散列字符串,然後將散列函數應用於用戶輸入並檢查數據庫中相同的散列字符串