字符串處理是業務代碼中最高頻的操作之一。本文整理一個静态类 StringHelper,涵蓋:按字節截取(中英文混排)、SQL 注入過濾、Email/URL/IP 格式驗證、客戶端 IP 獲取、全半角數字轉換、枚舉標誌位判斷等 10+ 實用方法,代碼緊湊、註釋清晰,可直接納入項目公共庫。
| 方法 | 功能 | 備註 |
|---|---|---|
GetSubString | 按字節截取,超長尾部加「...」 | GB2312 編碼,中文 2 字節 |
GetSub1String | 按字節截取,不加省略號 | 同上 |
ProcessSqlStr | SQL 關鍵字黑名單過濾 | 返回 bool,true=安全 |
IsSafeSqlString | 正則檢測危險字符(單引號、分號等) | 返回 bool |
mashSQL | 單引號轉義('→'') | 簡易防注入 |
IsValidEmail | Email 格式正則驗證 | 返回 bool |
IsURL | URL 格式正則驗證(支持 IP/域名/端口/路徑) | 返回 bool |
GetIP | 獲取客戶端真實 IP | 依次讀取 HTTP_X_FORWARDED_FOR / REMOTE_ADDR / UserHostAddress |
IsIP | IPv4 格式正則驗證 | 返回 bool |
SBCCaseToNumberic | 全角數字(0-9)轉半角(0-9) | Unicode 碼位偏移實現 |
CheckFlagsEnumEquals | 位枚舉值包含判斷 | (checking & expected) == expected |
public static string GetSubString(string origStr, int endIndex) {
if (string.IsNullOrEmpty(origStr) || endIndex < 0) return "";
int bytesCount = Encoding.GetEncoding("gb2312").GetByteCount(origStr);
if (bytesCount <= endIndex) return origStr;
int readyLength = 0;
for (int i = 0; i < origStr.Length; i++) {
int byteLength = Encoding.GetEncoding("gb2312").GetByteCount(new char[] { origStr[i] });
readyLength += byteLength;
if (readyLength >= endIndex) {
return origStr.Substring(0, readyLength == endIndex ? i + 1 : i) + "...";
}
}
return origStr;
}
逐字符累加字節數,精準截斷於字節邊界,避免半個漢字亂碼。
ProcessSqlStr:關鍵字黑名單(exec、insert、select、drop、script、iframe…)IsSafeSqlString:字符級白名單正則 ^[-|;|,|/|(|)|[|]|}|{|%|@|*|!|']mashSQL:單引號雙寫轉義最佳實踐:請優先使用參數化查詢 (SqlParameter) 或 ORM,僅在無法參數化的舊代碼中作為補充過濾。
public static string GetIP() {
string result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(result))
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
if (string.IsNullOrEmpty(result))
result = HttpContext.Current.Request.UserHostAddress;
return (string.IsNullOrEmpty(result) || !IsIP(result)) ? "0.0.0.0" : result;
}
兼容反向代理 (Nginx/IIS ARR) 的 X-Forwarded-For 標頭。
利用 Unicode 編碼特性:全角數字碼位比半角大 0xFEE0 (65248),代碼通過 Encoding.Unicode.GetBytes 檢測高位字節為 0xFF (255) 並減去 32 (0x20) 實現轉換。
// 列表頁標題截取
string title = StringHelper.GetSubString(article.Title, 40); // "這是一個很長的標題..."
// 表單提交前過濾
if (!StringHelper.ProcessSqlStr(userInput)) throw new Exception("輸入包含非法字符");
// 登錄日誌記錄 IP
string ip = StringHelper.GetIP();
// 枚舉權限判斷
[Flags] enum Perm { Read=1, Write=2, Execute=4 }
Perm userPerm = Perm.Read | Perm.Write;
bool canWrite = StringHelper.CheckFlagsEnumEquals(userPerm, Perm.Write); // true
HttpContext.Current 不可用,請改用 IHttpContextAccessor 注入獲取 HttpContext。Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 並引用 System.Text.Encoding.CodePages 包。RegexOptions.Compiled 提升高頻調用性能。將 StringHelper 加入公共庫,即可在 Controller、Service、Middleware 中輕鬆調用,減少重復造輪子。