當今,大多數程式都會或多或少地使用SQL語句和資料庫打交道。在程式碼中,SQL語句以字串的形式存在,如“SELECT column1, column2, … FROM table1 WHERE param_column1 = value1 AND param_column2 =‘value2’ ”。這個例子以資料列param_column1、param_column2的值分別為value1、value2作為過濾條件,從資料表table1中查詢column1、column2等資料列。其中param_column1為整數類型,param_column2為字串類型。很多時候,value1與value2的值在程式運行時才能確定,這意味著SQL語句只能在程式運行中動態產生。不少開發人員喜歡採用字串拼湊的方式產生SQL語句,形如 “SELECT column1, column2, … FROM table1 WHERE param_column1 = ” + int_to_str( int_value )+ “ AND param_column2 =‘ ” + str_value + “ ’ ”。C程式員可能更傾向於選擇格式化字串的方式,其中格式類似於 “SELECT column1, column2,… FROM table1 WHERE param_column1 = %d AND param_column2 =‘ %s ’ ”,在實際的值代替%後,SQL語句發送給資料庫引擎。從SQL執行的角度看,字串格式化與字串拼湊並沒有太大的差別。每次查詢條件稍有變化,都會向資料庫提交不同的SQL語句。這些SQL語句之間雖然差別可能很小,但查詢引擎每次都得重新解析,造成執行效率的降低。另外,如果上面的例子中,如果param_column1或param_column2是二進位類型的資料,則要產生SQL語句顯然很麻煩。更為重要的是,這種產生SQL語句的方式存在安全隱患,很容易導致SQL注入式攻擊。又以上面的SQL語句為例,如果攻擊者為param_column2指定的值為“ ’ OR ‘’ = ‘ ”(不包含雙引號),則得到的SQL語句為“SELECT column1, column2, … FROM table1 WHERE param_column1 = value1 AND param_column2 =‘’ OR ‘’ = ‘’ ”,使WHERE子句形同虛設,table1中所有的記錄都會查詢出來。如果攻擊者更缺德一點,為param_column2指定的值為“ ’;DELETE FROM table1 WHERE ‘’ = ‘”(不包含雙引號),則得到的SQL語句為“SELECT column1, column2, … FROM table1 WHERE param_column1 = 0 AND param_column2 =‘’;DELETE FROM table1 WHERE ‘’ = ‘’ ”,執行之後,資料表table1就被清空了。