首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP.NET 登錄邏輯漏洞:SQL 注入風險與判斷邏輯錯誤雙重暴擊

     編輯:程式設計綜合問答

原代碼核心問題

// 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,與密碼驗證無關

三大致命缺陷

1. SQL 注入漏洞(最高風險)

用戶輸入 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()) { /* 登錄成功 */ }
    }
}

2. 密碼明文存儲與傳輸

  • 數據庫存儲明文密碼,違反基本安全合規
  • 傳輸層無 HTTPS,密碼明文傳輸
  • 修正:存儲 BCrypt/Argon2/PBKDF2 哈希值,驗證時比對哈希

3. 業務邏輯分支混亂

// 梳理後的正確邏輯結構
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("用戶名或密碼不正確");
}

安全加固清單

  1. 所有 SQL 參數化,杜絕字符串拼接
  2. 密碼存儲改為強哈希 + 隨機鹽值
  3. 登錄頁面強制 HTTPS,設置 HttpOnly、Secure Cookie 標志
  4. 實施登錄失敗鎖定策略(如 5 次鎖定 15 分鐘)
  5. 輸出編碼防 XSS:Server.HtmlEncode 所有用戶可控輸出
  6. 最小權限原則:數據庫連接賬號僅擁有必要表的 SELECT/INSERT 權限

現代化替代方案

新項目建議直接使用 ASP.NET Core Identity 或 IdentityServer,內置上述所有安全最佳實踐,避免重複造輪子並踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved