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

C# 運算子判斷使用者名稱與密碼:邏輯、比較與 Null 條件運算子實戰

     編輯:更多程式設計知識

情境

模擬登入驗證,示範 ==, !=, &&, ||, ?, ??, ?. 等運算子在字串比對中的行為差異。

核心程式碼


using System;

class LoginDemo {
    static void Main() {
        // 模擬資料庫儲存的帳密
        const string dbUser = "admin";
        const string dbPass = "P@ssw0rd";

        Console.Write("帳號:"); string inputUser = Console.ReadLine();
        Console.Write("密碼:"); string inputPass = Console.ReadLine();

        // 1. 基本比較 (序數比較,區分大小寫)
        bool userOk = (inputUser == dbUser);
        bool passOk = (inputPass == dbPass);

        // 2. 邏輯與 &&
        if (userOk && passOk) {
            Console.WriteLine("登入成功!");
            return;
        }

        // 3. 邏輯或 || 給出具體錯誤提示
        if (!userOk && !passOk) Console.WriteLine("帳號與密碼皆錯誤");
        else if (!userOk)       Console.WriteLine("帳號錯誤");
        else                    Console.WriteLine("密碼錯誤");

        // 4. Null 條件運算子 ?. 與 ?? 示範
        string displayName = inputUser?.Trim() ?? "訪客";
        Console.WriteLine($"歡迎,{displayName}");

        // 5. 字串比較進階:OrdinalIgnoreCase (不區分大小寫)
        bool userOkCI = string.Equals(inputUser, dbUser, StringComparison.OrdinalIgnoreCase);
        Console.WriteLine($"不區分大小寫比對:{userOkCI}");

        // 6. 安全比較:避免時序攻擊 (示意)
        // 實務請用 Cryptography.FixedTimeEquals 或 BCrypt
        Console.WriteLine("--- 安全比較示意 ---");
        bool safeEq = FixedTimeEquals(inputPass, dbPass);
        Console.WriteLine($"固定時間比對:{safeEq}");
    }

    // 簡易固定時間比對 (僅示意,生產環境請用成熟庫)
    static bool FixedTimeEquals(string a, string b) {
        if (a == null || b == null) return false;
        int len = Math.Max(a.Length, b.Length);
        int diff = 0;
        for (int i = 0; i < len; i++) {
            char ca = i < a.Length ? a[i] : '\0';
            char cb = i < b.Length ? b[i] : '\0';
            diff |= ca ^ cb;
        }
        return diff == 0;
    }
}

運算子行為對照表

運算子用途範例備註
==相等比較user == "admin"字串多載為序數比較
!=不相等pass != "123"
&&邏輯且 (短路)userOk && passOk左側 false 不評估右側
||邏輯或 (短路)!userOk || !passOk左側 true 不評估右側
? (三元)條件表達式userOk ? "成功" : "失敗"
??Null 聯合input ?? "預設"左側非 null 回傳左側
?.Null 條件存取input?.Trim()input 為 null 直接回傳 null
?[]Null 條件索引arr?[0]C# 6+

安全性補充

  1. 不要用 == 比對密碼雜湊:字串比較會提前結束,導致時序攻擊。請用 BCrypt.Net-Next 或 Microsoft.AspNetCore.Cryptography.KeyDerivation。
  2. 資料庫查詢使用參數化:cmd.Parameters.AddWithValue("@u", user),防 SQL Injection。
  3. 密碼策略:最小長度、複雜度、禁用常見密碼、啟用 MFA。
  4. 帳號鎖定:連續失敗 N 次鎖定 15 分鐘,記錄稽核日誌。

結語

C# 提供豐富運算子處理字串比對與空值防禦,但登入驗證的核心在於安全比對與參數化查詢。理解各運算子短路行為與 Null 傳播語意,能寫出更簡潔、健壯的驗證邏輯。

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