0

我是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
        }

    }
}

任何可以检测到的问题?

谢谢

4

3 回答 3

3

您应该检查用户名是否存在于 Button_Click 中,而不是 Page_Load 中。理想情况下,两个查询都应该在同一个 SQL 事务中执行。此外,您绝对应该对第一个查询使用参数化查询(与您在第二个查询中执行的方式相同),以防止 SQL 注入。

于 2012-10-10T08:45:30.650 回答
2

Set primary key on the column UserName of the table user. So you don't have to check for the user existence in the database at the time of insertion, reducing an extra call to database. This way command.ExecuteNonQuery() won't allow you to insert duplicate users and throw exception and you can take necessary actions in the catch block of your code.

于 2012-10-10T08:49:20.603 回答
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 异常,因此您只需在应用程序中捕获它并执行您需要的任何操作(在大多数情况下重新加载注册页面)。

PS:考虑在将密码放入数据库之前使用一些哈希算法(如 MD5)对密码进行哈希处理。登录时也不要忘记在客户端对密码进行哈希处理。 PPS:使用 SQL 参数作为登录名、密码和所有其他用户输入的信息,以防止 SQL 注入。

于 2012-10-10T09:55:30.623 回答