// 1. 拼接 SQL 直接導致注入
sql = "select * from [allusers] where username='" + TextBox1.Text.Trim()
+ "' and pwd='" + TextBox2.Text.Trim() + "'";
// 2. 判斷邏輯倒置導致永遠進 else
if (result.Tables[0].Rows.Count > 0) { // 登錄成功分支
// ...
} else {
Response.Write("用戶名或密碼不正確");
}
// 但外層 if (cx.Text == "管理員") 的 else 分支寫著「系統錯誤,請不要越權操作」
// 當 cx 不為「管理員」時,直接進這個 else,與密碼驗證無關
用戶輸入 admin' -- 即可繞過密碼驗證登錄任意賬號。必須使用參數化查詢:
string sql = "SELECT * FROM [allusers] WHERE username=@user AND pwd=@pwd";
using (SqlCommand cmd = new SqlCommand(sql, conn)) {
cmd.Parameters.AddWithValue("@user", TextBox1.Text.Trim());
cmd.Parameters.AddWithValue("@pwd", TextBox2.Text.Trim()); // 生產環境應存哈希值
using (SqlDataReader dr = cmd.ExecuteReader()) {
if (dr.Read()) { /* 登錄成功 */ }
}
}
BCrypt/Argon2/PBKDF2 哈希值,驗證時比對哈希// 梳理後的正確邏輯結構
if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(pwd)) {
ShowAlert("請輸入完整");
return;
}
string role = cx.Text.Trim(); // "管理員" / "普通用戶" 等
string sql = "SELECT * FROM [allusers] WHERE username=@user AND pwd=@pwd AND role=@role";
// 參數化查詢...
if (userExists) {
Session["username"] = user;
Session["role"] = role;
Response.Redirect("main.aspx");
} else {
ShowAlert("用戶名或密碼不正確");
}
HttpOnly、Secure Cookie 標志Server.HtmlEncode 所有用戶可控輸出新項目建議直接使用 ASP.NET Core Identity 或 IdentityServer,內置上述所有安全最佳實踐,避免重複造輪子並踩坑。