模擬登入驗證,示範 ==, !=, &&, ||, ?, ??, ?. 等運算子在字串比對中的行為差異。
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+ |
== 比對密碼雜湊:字串比較會提前結束,導致時序攻擊。請用 BCrypt.Net-Next 或 Microsoft.AspNetCore.Cryptography.KeyDerivation。cmd.Parameters.AddWithValue("@u", user),防 SQL Injection。C# 提供豐富運算子處理字串比對與空值防禦,但登入驗證的核心在於安全比對與參數化查詢。理解各運算子短路行為與 Null 傳播語意,能寫出更簡潔、健壯的驗證邏輯。