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

SQL 查詢中特殊字元處理完全指南:單引號、管線符、雙引號與 & 符號

     編輯:Oracle 資料庫基礎

問題根源:字串串接導致語法錯誤

動態組合 SQL 時,若使用者輸入包含特殊字元(如 '、|、"、&),直接串接會破壞語法結構:

-- 使用者輸入 UID=1"test, PWD=A|&900
SQL = "SELECT * FROM SecurityLevel WHERE UID=""" & UserID & """"
-- 產生:SELECT * FROM SecurityLevel WHERE UID="1"test" AND PWD="A|&900"
-- 雙引號提前結束、管線符被解析為運算子,語法錯誤

通用解決方案:參數化查詢

最佳實務:使用參數化查詢(PreparedStatement、Command.Parameters),完全避免字串串接,同時防禦 SQL Injection。本文提供的函數僅適用於舊版無參數化支援的環境(如 ASP/VB6)。

VB6/ASP 字串轉義函數庫

核心替換函數

Function ReplaceStr(TextIn, SearchStr, Replacement, CompMode)
  Dim WorkText, Pointer
  If IsNull(TextIn) Then ReplaceStr = Null : Exit Function
  WorkText = TextIn
  Pointer = InStr(1, WorkText, SearchStr, CompMode)
  Do While Pointer > 0
    WorkText = Left(WorkText, Pointer - 1) & Replacement & Mid(WorkText, Pointer + Len(SearchStr))
    Pointer = InStr(Pointer + Len(Replacement), WorkText, SearchStr, CompMode)
  Loop
  ReplaceStr = WorkText
End Function

針對不同資料庫的封裝函數

-- 標準 SQL:雙引號轉義為兩個雙引號
Function SQLFixup(TextIn)
  SQLFixup = ReplaceStr(TextIn, """", """""", 0)
End Function

-- Jet/Access:額外處理管線符 (Chr(124))
Function JetSQLFixup(TextIn)
  Dim Temp
  Temp = ReplaceStr(TextIn, """", """""", 0)
  JetSQLFixup = ReplaceStr(Temp, "|", Chr(124), 0)
End Function

-- 首字元特殊處理 (如 LIKE 模式)
Function FindFirstFixup(TextIn)
  Dim Temp
  Temp = ReplaceStr(TextIn, """", Chr(34) & Chr(39), 0) ' 雙引號+單引號
  FindFirstFixup = ReplaceStr(Temp, "|", Chr(124), 0)
End Function

使用範例

SQL = "SELECT * FROM SecurityLevel WHERE UID=""" & SQLFixup(UserID) & """ "
SQL = SQL & " AND PWD=""" & SQLFixup(PassWord) & """ "

現代開發建議

  • .NET:SqlCommand.Parameters.AddWithValue("@uid", userID)
  • Java:PreparedStatement.setString(1, userID)
  • PHP:PDO::prepare() + bindParam()
  • Python:cursor.execute("... WHERE uid=%s", (userID,))

參數化查詢同時解決特殊字元、SQL 注入、執行計畫重用三大問題,請務必作為預設開發模式。

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