ASP.NET 初學者在實現用戶註冊時,常因連接字串配置錯誤、SQL 語法問題或未使用參數化命令而遭遇異常。本文以一個典型的註冊按鈕點擊事件為例,梳理排查思路並給出安全重構方案。
提問者的代碼直接拼接用戶輸入構建 SQL,且未展示具體錯誤信息,但隱患顯而易見:
protected void Button4_Click(object sender, EventArgs e) {
string usersex = " ";
if (RadioButton3.Checked == true) usersex = "男";
else usersex = "女";
string connString = System.Configuration.ConfigurationManager.ConnectionStrings["yhzlConnectionString"].ConnectionString;
SqlConnection myConn = new SqlConnection(connString);
// 危險:直接拼接用戶輸入
string sqlStr = " insert into 用戶資料(用戶名,密碼,權限,性別,地址) values('" + txtzcName.Text.ToString() + "','" + txtzcPasswork.Text.ToString() + "','" + 0 + "','" + usersex + "','" + txtadd.Text.ToString() + "') ";
SqlCommand myCmd = new SqlCommand(sqlStr, myConn);
myConn.Open();
myCmd.ExecuteNonQuery();
myConn.Close();
}
使用參數化命令與 `using` 區塊,同時解決安全、語法與資源管理問題:
protected void Button4_Click(object sender, EventArgs e) {
string usersex = RadioButton3.Checked ? "男" : "女";
string connString = ConfigurationManager.ConnectionStrings["yhzlConnectionString"].ConnectionString;
// 參數化 SQL,欄位名建議加方括號避免保留字衝突
string sqlStr = @"INSERT INTO [用戶資料] ([用戶名], [密碼], [權限], [性別], [地址])
VALUES (@UserName, @Password, @Role, @Sex, @Address)";
using (SqlConnection conn = new SqlConnection(connString))
using (SqlCommand cmd = new SqlCommand(sqlStr, conn)) {
cmd.Parameters.AddWithValue("@UserName", txtzcName.Text.Trim());
cmd.Parameters.AddWithValue("@Password", txtzcPasswork.Text.Trim()); // 實際應存儲哈希值
cmd.Parameters.AddWithValue("@Role", 0);
cmd.Parameters.AddWithValue("@Sex", usersex);
cmd.Parameters.AddWithValue("@Address", txtadd.Text.Trim());
conn.Open();
cmd.ExecuteNonQuery();
} // 自動關閉連接
}
採用此模式,您的註冊功能將更健壯、更安全。