當今,大多數程式都會或多或少地使用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就被清空了。
引數化SQL中 Like 和 In 的寫法
like 引數 string strsql select from person.address where city like add sqlparameter parameters new sqlparameter 1 parameters 0 new sqlparameter add bre ...
sql中GET引數的講解
sql select from users where id id limit 0,1 加上1 報錯 可以用 1 或者 23 注釋 這裡單引號和 只是用來注釋 報錯的話需要 id 1 sql select from users where id id limit 0,1 加上1 報錯為 使用 報錯會...
JAVA中防止SQL注入
如果使用者執行 select from product where id 5 這條語句。其中5是有使用者輸入的。sql注入的含義就是,一些搗蛋使用者輸入的不是5,而是5 delete from orders 那麼原來的sql語句將會變為,select from product where id 5 ...