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

ユーザー名が Page_Load 内ではなく、Button_Click 内に存在するかどうかを確認する必要があります。理想的には、両方のクエリを同じ SQL トランザクション内で実行する必要があります。また、SQL インジェクションを防ぐために、最初のクエリにはパラメータ化されたクエリを絶対に使用する必要があります (2 番目のクエリで行っているのと同じ方法)。

于 2012-10-10T08:45:30.650 に答える
2

userの列UserNameに主キーを設定します。そのため、挿入時にデータベースにユーザーが存在するかどうかを確認する必要がなく、データベースへの余分な呼び出しが減ります。このように command.ExecuteNonQuery() は、重複したユーザーを挿入して例外をスローすることを許可せず、コードの catch ブロックで必要なアクションを実行できます。

于 2012-10-10T08:49:20.603 に答える
0
  1. SQL Database でユーザー ログイン用の一意のフィールドを作成します。
  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 などのハッシュ アルゴリズムを使用してパスワードをハッシュすることを検討してください。また、ログイン時にクライアント側でパスワードをハッシュすることを忘れないでください。

于 2012-10-10T09:55:30.623 に答える