我使用以下代码使用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时转换失败。)
答案 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();