2012-10-10 142 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注入。