我无法在密码字段中输入字符。我只能输入号码

时间:2010-12-22 18:40:34

标签: c# asp.net visual-studio

我使用以下代码使用md5加密密码并将其存储在数据库中。

public partial class register : System.Web.UI.Page
    {
        SqlConnection con = new SqlConnection("Data Source=Shihab-PC;Initial Catalog=test;User ID=sh;Password=admin1");
        SqlCommand cmd = new SqlCommand();
        SqlDataAdapter ad = new SqlDataAdapter();
        DataSet ds = new DataSet();
        SqlDataReader dr;
        protected void Page_Load(object sender, EventArgs e)
        {
            SqlConnection myconnection;
            SqlCommand mycommand;
            string query;
            myconnection = new SqlConnection("Data Source=Shihab-PC;Initial Catalog=test;User ID=sh;Password=admin1");
            if (!Page.IsPostBack)
            {
                myconnection.Open();
                query = "select * from Users";
                mycommand = new SqlCommand(query, myconnection);
                dr = mycommand.ExecuteReader();
                dr.Read();
                int count = Convert.ToInt16(dr[0].ToString());
                while (dr.Read())
                { count++; }
                TextBox4.Text = Convert.ToString(count + 1);

            }



        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            SqlConnection myconnection;
            SqlCommand mycommand;
            int ra;
            string query;
            myconnection = new SqlConnection("Data Source=Shihab-PC;Initial Catalog=test;User ID=sh;Password=admin1");
            myconnection.Open();



            MD5CryptoServiceProvider md5hasher = new MD5CryptoServiceProvider();
            Byte[] hashedDataBytes;
            UTF8Encoding encoder = new UTF8Encoding();
            hashedDataBytes = md5hasher.ComputeHash(encoder.GetBytes(TextBox2.Text));

            StringBuilder hex = new StringBuilder(hashedDataBytes.Length * 2);
            foreach (Byte b in hashedDataBytes)
            {
                string x = b.ToString() + " ";
                hex.AppendFormat("{0:x2}", b);

            }


            query = "Insert into Users values(" + TextBox4.Text + ",'" +
                                                   TextBox3.Text + "','" +

                                                   hex.ToString() + "','" +

                                                   TextBox1.Text + "','" +
                                                    TextBox5.Text + "','" +
                                                    TextBox6.Text + "','" +
                                                    TextBox7.Text + "','" +
                                                    TextBox8.Text + "','" +
                                                    TextBox9.Text + "','" +
                                                   TextBox10.Text + "')";

            mycommand = new SqlCommand(query, myconnection);
            ra = mycommand.ExecuteNonQuery();
            if (ra > 0)
            {
                string msg = "alert('Record Inserted Sucessfuly')";
                Page.ClientScript.RegisterStartupScript(this.GetType(), "Message", msg, true);
                Response.Redirect("signin.aspx");
            }
            else
            {
                string msg = "alert('Unable to Insert Record ')";
                Page.ClientScript.RegisterStartupScript(this.GetType(), "Message", msg, true);
            }
            myconnection.Close();
        }
    }

运行代码并在密码字段中输入字符时的问题我得到以下内容  错误(将varchar值'1234567yY'转换为数据类型int时转换失败。)

3 个答案:

答案 0 :(得分:1)

第一个选项:指定INSERT SQL中的列。

INSERT INTO Users (UserID, Col2, Col3 ...) VALUES (...)

第二个选项:查看query实际是什么,并使用SQL Server Management Studio对其进行调试。

在此行上放置一个断点,然后查看query的本地人。

mycommand = new SqlCommand(query, myconnection);

第三个选项:使用参数化查询并在命令的“参数”属性中设置值。

那些维护了你的人会感谢你,你将在这部分代码中摆脱SQL注入的可能性。

答案 1 :(得分:1)

您的代码有很多的问题。

它会泄漏连接,SQL注入已经成熟,而且非常脆弱。一次拿这些。

首先,您应该在using子句中包装实现IDisposable的每个对象。这是确保在适当的时间清理对象的最佳实践方法。请参阅此问题以获取示例:c# closing sqlconnection and sqldatareader or not?

在非常轻微的系统上,您可能不会注意到连接池回收问题。但是,只要您获得任何流量级别,此代码就会以有趣且有时无法预测的方式爆炸。

其次,为了防止sql注入,请不要使用字符串连接来构建查询。而是使用参数。 @ decyclone的答案显示了如何执行此操作的示例。破解你现在拥有的代码是微不足道的。

第三,您的查询非常脆弱。 insert语句取决于users表中字段的顺序,因此永远不会修改表。您第一次重新排序这些字段或添加一个新的代码将破坏您的代码。直到运行时才会发现这个bug。您应该明确设置要插入的字段。例如:

insert into Users(Username,Password) values('SomeUser', 'SomePassword')

答案 2 :(得分:0)

您似乎正在尝试将varchar值插入数据库中的int类型列。

更好的方法是使用Command Parameters来防止这样的错误。

实施例

SqlCommand command = new SqlCommand("Insert into Users(UserName, Password) Values(@UserName, @Password)", connection);
command.Parameters.AddWithValue("@UserName", "SomeUser"); // You pass something else instead of "SomeUser"
command.Parameters.AddWithValue("@Password", "Password"); // You pass something else instead of "Password"
command.ExecuteNonQuery();