2012-10-10 168 views
0

我是新來的asp.net,我正在寫一個登錄腳本&學習數據庫應用程序。但腳本似乎不起作用。它仍然可以添加重複的用戶名。這裏是腳本Asp.net登錄腳本

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; 
using System.Configuration; 

public partial class Registration : System.Web.UI.Page 
{ 
    static string temp; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["earchConnectionString"].ConnectionString); 
      con.Open(); 
      string cmdStr = "Select count(*) from [user] where UserName='" + TextBoxUN.Text + "'"; 

      SqlCommand userExist = new SqlCommand(cmdStr, con); 
      int temp = Convert.ToInt32(userExist.ExecuteScalar().ToString()); 

      con.Close(); 
      if (temp == 1) 
      { 
       Response.Write("User Name Already Exist....<br /> Please Choose Another User Name."); 
      } 
     } 

    } 
    protected void Submit_Click(object sender, EventArgs e) 
    { 

     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["earchConnectionString"].ConnectionString); 
     con.Open(); 
     string insCmd = "Insert into [user] (UserName, Password, EmailAddress, FullName, level) values (@UserName,@Password,@EmailAddress, @FullName, @level)"; 
     SqlCommand insertUser = new SqlCommand(insCmd, con); 
     insertUser.Parameters.AddWithValue("@UserName", TextBoxUN.Text); 
     insertUser.Parameters.AddWithValue("@Password", TextBoxPass.Text); 
     insertUser.Parameters.AddWithValue("@EmailAddress", TextBoxEA.Text); 
     insertUser.Parameters.AddWithValue("@FullName", TextBoxFN.Text); 
     insertUser.Parameters.AddWithValue("@level", level.SelectedValue.ToString()); 

     try 
     { 
      insertUser.ExecuteNonQuery(); 
      con.Close(); 
      //Response.Redirect("Login.aspx"); 
      Label1.Text = temp; 
     } 
     catch (Exception er) 
     { 
      Response.Write("Something wrong"); 
     } 
     finally 
     { 
      //Any Special Action You Want To Add 
     } 

    } 
} 

任何可以檢測到的問題?

感謝

+2

你真的應該參數化你的第一個查詢 - 你直接將用戶輸入提供給一個sql查詢 - http://en.wikipedia.org/wiki/SQL_injection – dash

+0

是的,肯定參數化該查詢,否則你的應用程序可以使用[ SQL注入](http://en.wikipedia.org/wiki/SQL_injection)。請參閱[這裏](http://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CCoQFjAB&url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us %2Fmagazine%2Fcc163917.aspx&ei = 8TV1ULm3AqLG0QWKsoGIDw&usg = AFQjCNE8G1Y5 - o-pR -19VgTgXKckluPkw&sig2 = kiYfpNLn8C0nt25PntB88w)獲得更多幫助。 –

回答

3

你應該做的用戶名是否存在於您的Button_Click裏面,內部沒有的Page_Load檢查。理想情況下,兩個查詢應該在同一個SQL事務中執行。另外,爲了防止SQL注入,您應該絕對使用第一個參數化查詢(與第二個查詢中的相同方式)。

+1

擊敗我:-)。我唯一的建議是爲用戶名列添加一個唯一的索引,以確保重複是不可能的 - 如果表中已經有重複項,那麼邏輯(count == 1)將繼續允許更多重複。 – dash

2

在列上設置主鍵用戶名用戶。因此,您不必在插入時檢查數據庫中的用戶存在情況,從而減少對數據庫的額外調用。這樣command.ExecuteNonQuery()不會允許你插入重複的用戶並拋出異常,你可以在代碼的catch塊中採取必要的行動。

+1

嗯。我建議不要使用除主鍵的自動遞增積分ID以外的任何其他內容。其他任何事實都是對單一責任主體的侵犯。唯一的約束/索引是爲此目的而設計的,這就是應該使用的。 – spender

0
  1. 爲SQL數據庫中的用戶登錄創建一個唯一字段。
  2. 在建立帳戶按鈕單擊事件帳戶創建頁面做如下:

      try 
          { 
    
           SqlCommand command = new SqlCommand("INSERT INTO Users(login,password) VALUES ('" + txtLogin.Text + "','" + txtPass.Text+ "');", con); 
           command.ExecuteNonQuery(); 
           Response.Redirect("login.aspx"); 
          } 
    
          catch (SqlException) 
          { 
           lblWrongLogin.Text = "Username already exists."; 
          } 
    

基本上,當你嘗試寫在SQL數據庫中的一個重複登錄你的SQL例外,所以你只要在應用程序中捕獲它並執行所需的任何操作(在大多數情況下重新加載註冊頁面)。

P.S .: 考慮使用一些散列算法(如MD5)在將密碼放入數據庫之前進行散列密碼。登錄時也不要忘記在客戶端散列密碼。 P.P.S .:使用SQL參數進行登錄,密碼和其他每個用戶輸入的信息以防止SQL注入。