首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Effective C# 原則 39:善用 .NET 驗證框架,捍衛應用程式安全

     編輯:關於C#

使用者輸入不可信,可能導致例外、SQL 注入等攻擊。.NET 提供完整驗證框架,Web 與 Windows 表單各有機制,應優先使用內建工具減少手寫代碼。

Web 表單驗證控制項

瀏覽器端產生 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 區碼、可選分隔符、交換碼與號碼。

Windows 表單驗證

掛載 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);
}

兩個關鍵細節

  1. CausesValidation 屬性:取消按鈕設為 false,否則使用者無法直接關閉對話框;
  2. OK 按鈕必須強制驗證所有控制項(含巢狀容器),避免使用者直接點 OK 略過驗證:

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);
    }
}

DataGrid/DataSet 快速驗證

設定 ErrorProvider.DataSource/DataMember 或呼叫 BindToDataAndErrors,配合 DataRow.RowError/SetColumnError 自動顯示紅色警示圖示。

總結

驗證所有使用者輸入,但請善用框架內建工具:Web 用驗證控制項+正則,WinForms 用 Validating 事件+ErrorProvider,DataSet 用資料繫結錯誤通知。減少手寫代碼,提升安全與維護性。

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