以經典「用戶登錄驗證」為例,深度對比三種 ADO.NET 數據庫操作模式的優劣,揭示 SQL 注入風險、性能差異、維護成本,給出架構選型建議。
輸入:用戶名、密碼 → 查詢 users 表匹配記錄數 → 返回 1 登錄成功,否則失敗。
string sql = "SELECT COUNT(*) FROM users WHERE name='" + txtUser.Text + "' AND pwd='" + txtPwd.Text + "'";
cmd.CommandText = sql;
int count = (int)cmd.ExecuteScalar();
致命缺陷:輸入 asd' OR 's'='s 可繞過驗證。嚴禁生產環境使用。
string sql = "SELECT COUNT(*) FROM users WHERE name=@name AND pwd=@pwd";
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("@name", txtUser.Text);
cmd.Parameters.AddWithValue("@pwd", txtPwd.Text);
int count = (int)cmd.ExecuteScalar();
優勢:
cmd.CommandText = "sp_CheckLogin";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@name", txtUser.Text);
cmd.Parameters.AddWithValue("@pwd", txtPwd.Text);
int count = (int)cmd.ExecuteScalar();
額外優勢:
EXECUTE 權限,無需表直接訪問權限。劣勢:調試困難、版本控制弱、業務邏輯分散、資料庫遷移成本高。
| 維度 | 拼接 SQL | 參數化 SQL | 存儲過程 |
|---|---|---|---|
| 安全性 | 極低(注入) | 高 | 高 |
| 性能 | 低(重編譯) | 高(計劃復用) | 高(預編譯+批次) |
| 維護性 | 差 | 好 | 中(邏輯分散) |
| 調試體驗 | 好 | 好 | 差 |
| 適用場景 | 僅原型/測試 | 90%+ 業務查詢 | 複雜事務/批量/權限隔離 |
總結:參數化 SQL 是日常開發的基石,存儲過程是複雜場景的利器,拼接 SQL 是必須根除的安全隱患。選對模式,事半功倍。