首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC++ ADO Access SQL 參數化查詢:CString.Format 解決變數注入問題

     編輯:程式設計綜合問答

問題程式碼

int b, c;
char c1[12], c2[12];
GetDlgItem(IDC_EDIT1)->GetWindowText(c1, 12);
GetDlgItem(IDC_EDIT5)->GetWindowText(c2, 12);
b = atoi(c1); c = atoi(c2);

CString SQL = "select * from employees where 爐號 >= b and 爐號 <= c";
// 錯誤:SQL 字串中直接寫變數名 b, c,資料庫不認識

錯誤原因

C++ 字串字面值中不會自動展開變數值,b、c 被視為 SQL 中的字面字串或識別碼,導致「參數未指定值」或語法錯誤。

正確做法:CString.Format 格式化注入

CString SQL;
SQL.Format(_T("select * from employees where 爐號 >= %d and 爐號 <= %d"), b, c);
// %d 對應 int 型別,自動轉為字串插入

進階:參數化命令 (更安全、效能更好)


_CommandPtr pCmd(__uuidof(Command));
pCmd->ActiveConnection = m_Ado.m_pConnection;
pCmd->CommandText = _T("select * from employees where 爐號 >= ? and 爐號 <= ?");
pCmd->CommandType = adCmdText;

pCmd->Parameters->Append(pCmd->CreateParameter(_T("@min"), adInteger, adParamInput, 0, b));
pCmd->Parameters->Append(pCmd->CreateParameter(_T("@max"), adInteger, adParamInput, 0, c));

_RecordsetPtr pRs = pCmd->Execute(NULL, NULL, adCmdText);
// 後續處理 pRs...

關鍵差異對比

方法SQL 注入風險型別安全執行計畫重用適用場景
CString.Format 拼接高 (若輸入含引號)靠開發者否簡單整數/受控輸入
ADO 參數化命令無強型別是所有生產環境查詢

欄位名稱最佳實務

  • 避免使用中文、特殊符號(/、#、空格)作為欄位名。
  • 若必須使用,SQL 中務必以方括號 [爐號] 包裹。
  • 建議改用英文欄位名(如 furnace_no),並建立視圖或別名供中文介面顯示。

總結

使用 CString.Format(_T("... %d ..."), var) 可快速修正變數注入問題;長期專案強烈建議改用 ADO 參數化命令,確保安全與效能。

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