在做機房收費系統專案,編寫資料連線並訪問資料庫時,見別人都用了帶「@」字元的sql語句,就很好奇為什麼都用這個語句呢?直接拼寫sql語句不是更加方便嗎?
帶著這個問題上網查資料,才知道原來他們用的是引數化sql,那麼為什麼要用引數化sql?什麼是引數化sql呢?
在做第一次機房收費系統的時候,大部分的應該都是使用直接拼sql語句的方法,那時候就聽前輩們有說到sql注入,那時候也不要求了解,只需要知道就行。
1.直接拼sql:
就像大家在做第一次機房收費系統的時候所了解到的一樣,直接拼寫sql很容易帶來sql注入攻擊,但是因為直接拼寫不用新增sqlparameter,所以會減少很少的**。因此,這種方法也會把你直接編寫的命令直接發到資料伺服器上直接執行。
2.引數化sql:
所謂的「引數化sql」就是在應用程式設定sqlcommand.commandtext的時候使用引數(如:param1),然後通過sqlcommand.parameters.add來設定這些引數的值。這種做法會把你準備好的命令通過sp_executesql系統儲存過程來執行,使用引數化,最直接的好處就是防止sql注入。也就是說使用這種方法,主要是為了保證資料庫的安全。
引數化sql原理:
在使用引數化查詢的情況下,資料伺服器不會將引數的內容視為
sql指令的一部分來處理,而是在資料庫完成
sql指令之後,才套用引數執行,因此就算引數中含有有損的指令,也不會被資料庫執行。
下面只是自己在做機房收費系統專案的時候,用到引數化查詢的乙個小例子:
public class sqlstubasicinfo : implements istubasicinfodim conn as sqlconnection = new sqlconnection(strconnstr) '例項化connection物件
''' ''' 判斷卡號是否存在
'''
'''
''' 返回實體層
'''
public function checkcardno(icard as stubasicinfo) as enity.stubasicinfo implements istubasicinfo.checkcardno
dim sql as string = "select * from t_stubasicinfo where cardno=@cardno"
dim params as sqlparameter()
params =
dim cmd as sqlcommand = new sqlcommand(sql, conn)
cmd.parameters.addrange(params)
dim reader as sqldatareader
tryconn.open()
reader = cmd.executereader
reader.read()
icard.cardno = trim(reader.item("cardno"))
return icard
catch ex as exception
icard.cardno = ""
return icard
end try
end function
以前,對學習新的知識總是帶有一種恐懼感,總覺得自己不能把它們弄明白。看到別人在做專案的時候,用到了很多自己不會的知識,就覺得很有壓力,其實換一種心態去想,這正是給你提供了乙個提公升自我的機會,誰不是從不會走過來的!
引數化的sql
我們原先寫的sql語句總是把條件直接拼進去,這樣每次的sql都是不同的,但這些sql除了條件部分不同外,其他都是一樣的,sqlserver在解析sql語句的時候分了幾個步驟 1 語法分析 2 生成乙個執行計畫 執行計畫就是執行的路徑,完成乙個任務可以有好多條路徑的,sqlserver會通過複雜的分析...
mysql 引數化 MySQL之sql引數化
奮鬥的路上,時間總是過得很快,目前的困難和麻煩是很多,但是只要不忘初心,腳踏實地一步一步的朝著目標前進,最後的結局交給時間來定奪。週末了,我們來說說一下,sql語句的引數化問題,為了避免sql注入的問題,我們把sql語句進行引數化,來增加資料庫的安全性。詞窮,先看看code吧!from mysqld...
SQL語句引數化 封裝
封裝sql語句引數化 以下 寫為sqlcanshuhua.py檔案 encoding utf 8 from pymysql import class mysqlhelper def init self,user,passwd,db,host localhost port 3306,charset u...