帳號/密碼、角色名稱創建與登入驗證未區分大小寫,導致「Admin」與「admin」視為同一賬號,嚴重安全隱患。
| 方案 | 優點 | 缺點 | 風險 |
|---|---|---|---|
修改資料庫 lower_case_table_names/校對規則 | 全域生效 | 需重建庫/表,現有資料可能亂碼 | 極高 |
修改表/欄位校對規則 COLLATE utf8_bin | 精準控制 | 需 ALTER TABLE 鎖表,大表停機久 | 中 |
SQL 層面用 BINARY | 零改表、即時生效、精準控制單條查詢 | 需修改所有相關 SQL/存儲過程 | 低 |
-- 登入驗證:強制大小寫敏感比對
SELECT * FROM users
WHERE username = 'Admin' AND BINARY password = 'Secret123';
-- 建立賬號檢查:避免大小寫衝突
SELECT COUNT(*) FROM users WHERE BINARY username = 'admin';
mysql> SELECT BINARY 'ABCD' = 'abcd' AS ret1, 'ABCD' = 'abcd' AS ret2;
+------+------+
| ret1 | ret2 |
+------+------+
| 0 | 1 | -- BINARY 區分大小寫,普通比對不區分(預設校對 _ci)
+------+------+
BINARY 非函數,屬**類型轉換操作符**,將後續字串視為二進位字串逐字節比較。CAST(str AS BINARY) 或 COLLATE utf8mb4_bin。_bin 或建立 _bin 索引),否則可能全表掃描。COLLATE utf8mb4_bin 或 utf8mb4_0900_as_cs(MySQL 8.0),一勞永逸。BINARY,其餘查詢視業務容忍度決定。EXPLAIN 確認索引生效,避免 BINARY 導致隱式轉換失效。