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

ASP 表單動態建構 SQL INSERT 語句基礎版(二)

     編輯:關於SqlServer

ASP 表單遍歷動態產生 INSERT:欄位名與值清單分離建構

完整程式碼

<%
Dim iStr, vStr, nStr, x
iStr = "INSERT INTO uData "
vStr = "VALUES ("
nStr = "("

' 遍歷表單集合建構 SQL 組成部分
For Each x In Request.Form
    ' 建立欄位名清單
    nStr = nStr & x & ", "
    
    ' 建立欄位值清單(數值型別不加引號)
    If UCase(x) = "AGE" Then
        vStr = vStr & Request.Form(x) & ", "
    Else
        vStr = vStr & "'" & Request.Form(x) & "', "
    End If
Next

' 移除結尾逗號空格並閉合
vStr = Left(vStr, Len(vStr) - 2) & ")"
nStr = Left(nStr, Len(nStr) - 2) & ") "

' 組裝完整 SQL
iStr = iStr & nStr & vStr

' 簡單驗證並輸出
If Trim(Request("fName")) <> "" Then
    Response.Write iStr & "<BR>"
End If
%>

關鍵邏輯解析

  1. **三段式建構**:欄位清單 (nStr) + 值清單 (vStr) + 基礎陳述式 (iStr)
  2. **型別簡易判斷**:`AGE` 欄位視為數值,不加單引號;其他視為字串加引號
  3. **字串清理**:`Left(str, Len(str)-2)` 移除結尾 `, `
  4. **基本驗證**:檢查 `fName` 非空才輸出 SQL

關鍵缺陷與風險

⚠ 嚴重安全與功能缺陷:
  • SQL 注入零防護:單引號未逸出,輸入 `O'Reilly` 即破壞 SQL 結構
  • 型別判斷硬編碼:僅 `AGE` 特殊處理,新增數值欄位需修改程式碼
  • 無 NULL/空值處理:空字串存成 `''` 而非 `NULL`
  • 無資料驗證:長度、格式、業務規則完全未檢查
  • 錯誤處理缺失:資料庫執行失敗無捕獲機制

改進版本對比(參考 86510、86512)

版本改進點殘留問題
第 1 版 (86512)固定欄位硬編碼,最基礎完全不通用,維護極困難
第 2 版 (本文)遍歷表單動態建構,型別簡易判斷SQL注入、硬編碼型別、無驗證
第 3 版 (86510)通用函數、排除清單、單引號逸出字串拼接本質未變,仍有注入風險
現代標準參數化查詢/預存程序/ORM架構複雜度較高

參數化查詢改寫(必要升級)

<%
Dim cmd, conn, x
Set cmd = Server.CreateObject("ADODB.Command")
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "YourConnectionString"
cmd.ActiveConnection = conn
cmd.CommandText = "INSERT INTO uData (fName, lName, age) VALUES (?, ?, ?)"
cmd.CommandType = 1

cmd.Parameters.Append cmd.CreateParameter("@fName", 200, 1, 50)
cmd.Parameters.Append cmd.CreateParameter("@lName", 200, 1, 50)
cmd.Parameters.Append cmd.CreateParameter("@age", 3, 1)

For Each x In Request.Form
    Select Case UCase(x)
        Case "FNAME": cmd("@fName") = Request.Form(x)
        Case "LNAME": cmd("@lName") = Request.Form(x)
        Case "AGE": cmd("@age") = CInt(Request.Form(x))
    End Select
Next

On Error Resume Next
cmd.Execute
If Err.Number <> 0 Then Response.Write "錯誤: " & Err.Description
%>

教學歷史定位

此類程式碼屬 **ASP 經典時期(1998-2002)** 教學範例,展示 `Request.Form` 集合遍歷與字串拼接技巧。**現代 Web 開發嚴禁使用**,僅供歷史技術演進參考與遷移重構時的風險識別。

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