首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 單引號處理兩大絕招:轉義字元法 vs 參數化查詢法的效能與安全對決

     編輯:關於SqlServer

前言

動態 SQL 中單引號處理不當是典型 Bug 來源:'O'Brien' 會導致語法錯誤,更嚴重的是為 SQL Injection 打開大門。本文對比兩種處理技法,結論明確:參數化查詢才是正解。

方法一:轉義字元處理 (VB6 範例)

Function ProcessStr(str As String) As String
Dim pos As Integer
pos = InStr(str, "'")
While pos > 0
str = Mid(str, 1, pos) & "'" & Mid(str, pos + 1)
pos = InStr(pos + 2, str, "'")
Wend
ProcessStr = str
End Function

原理: 掃描字串,每發現一個單引號,在其前插入另一個單引號(SQL Server 轉義規則)。

缺點:

  • 增加 CPU 處理時間(字串操作、迴圈掃描)
  • 僅解決單引號,無法防禦其他注入向量(註釋符、批次分隔符、Unicode 繞過等)
  • 維護負擔:每個動態 SQL 組裝點都需呼叫
  • 效能:字串串接本身即低效,再加處理開銷

方法二:ADO Command 參數化查詢 (VB6 範例)

Dim cmd As New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM Users WHERE Name = ?"
cmd.CommandType = adCmdText
cmd.Parameters.Append cmd.CreateParameter("Name", adVarChar, adParamInput, 50, userInput)
Set rs = cmd.Execute

原理: 將使用者輸入視為資料而非程式碼,由提供者負責正確編碼傳輸。

優點:

  • 安全: 徹底隔離程式碼與資料,防禦所有注入向量
  • 效能: 計畫快取重用(相同命令文本、不同參數),避免重複編譯
  • 可讀性: SQL 邏輯與參數分離,程式碼更清晰
  • 型別安全: 參數強型別,隱性轉換錯誤減少

進階組合:預存程序 + 參數化 = 最高效能

cmd.CommandText = "usp_GetUserByName"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("@Name", adVarChar, adParamInput, 50, userInput)
  • 預存程序預編譯、計畫持久化
  • 網路傳輸最小化(僅呼叫指令 + 參數)
  • 權限管控於程序層級(僅授予 EXEC 權限)

.NET 時代的標準寫法

// ADO.NET - 永遠使用參數化
using (var cmd = new SqlCommand("SELECT * FROM Users WHERE Name = @Name", conn))
{
cmd.Parameters.AddWithValue("@Name", userInput);
using (var reader = cmd.ExecuteReader()) { ... }
}

對比總結表

維度轉義字元法參數化查詢預存程序+參數化
安全性低(僅單引號)高(完整防禦)最高(權限隔離)
效能低(字串操作+重編譯)高(計畫重用)最高(預編譯+計畫持久化)
維護性差(散落各處)良(集中參數化)優(封裝邏輯)
適用場景極簡臨時腳本/舊代碼修補所有新開發動態 SQL核心業務/高頻/高安全需求

結語

單引號處理不是字串處理問題,而是程式碼與資料邊界問題。轉義字元法是權宜之計,參數化查詢才是工程正解。新專案零容忍字串串接 SQL,舊專案以參數化重構為優先技術債清償項目。

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