使用者輸入不可信,可能導致例外、SQL 注入等攻擊。.NET 提供完整驗證框架,Web 與 Windows 表單各有機制,應優先使用內建工具減少手寫代碼。
瀏覽器端產生 JavaScript,減少往返伺服器;伺服器端仍需二次驗證防程式式攻擊。五大核心控制項:
RequiredFieldValidator:必填;RangeValidator:數值/字串長度範圍;CompareValidator:跨控制項比較;RegularExpressionValidator:正則表達式(最強大);CustomValidator:自訂邏輯(需雙端實作,較繁瑣)。| 模式 | 含義 |
|---|---|
[a-z] | 單一小寫字母 |
\d | 任意數字 |
^/$ | 字串開頭/結尾 |
\w | 單字字元 [A-Za-z0-9_] |
{4,16} | 前一構造重複 4~16 次 |
(a|b|c) | 選擇匹配 |
((\(\s*\d{3}\s*\))|(\d{3}))-?\s*\d{3}\s*-\s*\d{4}
支援 (XXX) 或 XXX 區碼、可選分隔符、交換碼與號碼。
掛載 Control.Validating 事件或覆寫 OnValidating:
private void textBoxName_Validating(object sender, CancelEventArgs e) {
string error = null;
if (textBoxName.Text.Length == 0) { error = "請輸入名稱"; e.Cancel = true; }
errorProvider.SetError(textBoxName, error);
}
CausesValidation 屬性:取消按鈕設為 false,否則使用者無法直接關閉對話框;
private void btnOK_Click(object sender, EventArgs e) {
ValidateAllChildren(this);
}
private void ValidateAllChildren(Control parent) {
if (this.DialogResult == DialogResult.None) return;
foreach (Control c in parent.Controls) {
c.Focus();
if (!this.Validate()) { this.DialogResult = DialogResult.None; return; }
ValidateAllChildren(c);
}
}
設定 ErrorProvider.DataSource/DataMember 或呼叫 BindToDataAndErrors,配合 DataRow.RowError/SetColumnError 自動顯示紅色警示圖示。
驗證所有使用者輸入,但請善用框架內建工具:Web 用驗證控制項+正則,WinForms 用 Validating 事件+ErrorProvider,DataSet 用資料繫結錯誤通知。減少手寫代碼,提升安全與維護性。