新聞中心
sql注入的攻擊原理是什么?
SQL注入式攻擊的主要形式有兩種。

1、直接注入式攻擊法
直接將代碼插入到與SQL命令串聯(lián)在一起并使得其以執(zhí)行的用戶輸入變量。由于其直接與SQL語(yǔ)句捆綁,故也被稱為直接注入式攻擊法。
2、間接攻擊方法
它將惡意代碼注入要在表中存儲(chǔ)或者作為原數(shù)據(jù)存儲(chǔ)的字符串。在存儲(chǔ)的字符串中會(huì)連接到一個(gè)動(dòng)態(tài)的SQL命令中,以執(zhí)行一些惡意的SQL代碼。注入過程的工作方式是提前終止文本字符串,然后追加一個(gè)新的命令。如以直接注入式攻擊為例。就是在用戶輸入變量的時(shí)候,先用一個(gè)分號(hào)結(jié)束當(dāng)前的語(yǔ)句。然后再插入一個(gè)惡意SQL語(yǔ)句即可。由于插入的命令可能在執(zhí)行前追加其他字符串,因此攻擊者常常用注釋標(biāo)記“—”來(lái)終止注入的字符串。執(zhí)行時(shí),系統(tǒng)會(huì)認(rèn)為此后語(yǔ)句位注釋,故后續(xù)的文本將被忽略,不背編譯與執(zhí)行。
mybatis like查詢?cè)趺捶乐箂ql注入?
要防止SQL注入,可以使用參數(shù)綁定的方式來(lái)執(zhí)行Like查詢。
在MyBatis中,可以使用`#{} `來(lái)構(gòu)建參數(shù)占位符,而不是直接在SQL語(yǔ)句中拼接參數(shù)值。
例如,假設(shè)我們想要執(zhí)行一個(gè)Like查詢來(lái)查找名字以"abc"開頭的用戶:
```xml
```
在這個(gè)示例中,`#{name}`是一個(gè)參數(shù)占位符,MyBatis會(huì)根據(jù)傳入的參數(shù)值自動(dòng)將其替換為安全的SQL字符串。
注意,使用參數(shù)占位符不僅可以防止SQL注入,還可以避免因?yàn)閰?shù)值中包含特殊字符而導(dǎo)致的SQL語(yǔ)法錯(cuò)誤。
可以使用類似的方式來(lái)構(gòu)建其他類型的Like查詢,只需要根據(jù)實(shí)際的SQL語(yǔ)句進(jìn)行調(diào)整。
MyBatis怎么防止SQL注入?
用#{參數(shù)}進(jìn)行預(yù)編譯就可以防止了,千萬(wàn)別用${}這種方式注入?yún)?shù)。
mybatis框架作為一款半自動(dòng)化的持久層框架,其sql語(yǔ)句都要我們自己來(lái)手動(dòng)編寫,這個(gè)時(shí)候當(dāng)然需要防止sql注入。其實(shí)Mybatis的sql是一個(gè)具有“輸入+輸出”功能,類似于函數(shù)的結(jié)構(gòu),如下:
select id,title,author,content
from blog where id=#{id}
這里,parameterType標(biāo)示了輸入的參數(shù)類型,resultType標(biāo)示了輸出的參數(shù)類型?;貞?yīng)上文,如果我們想防止sql注入,理所當(dāng)然地要在輸入?yún)?shù)上下功夫。上面代碼中高亮部分即輸入?yún)?shù)在sql中拼接的部分,傳入?yún)?shù)后,打印出執(zhí)行的sql語(yǔ)句,會(huì)看到sql是這樣的:
select id,title,author,content from blog where id = ?
不管輸入什么參數(shù),打印出的sql都是這樣的。這是因?yàn)閙ybatis啟用了預(yù)編譯功能,在sql執(zhí)行前,會(huì)先將上面的sql發(fā)送給數(shù)據(jù)庫(kù)進(jìn)行編譯,執(zhí)行時(shí),直接使用編譯好的sql,替換占位符“?”就可以了。因?yàn)閟ql注入只能對(duì)編譯過程起作用,所以這樣的方式就很好地避免了sql注入的問題。
到此,以上就是小編對(duì)于防止sql注入攻擊的方式的問題就介紹到這了,希望這3點(diǎn)解答對(duì)大家有用。
網(wǎng)站標(biāo)題:sql注入的攻擊原理是什么?(如何有效防止SQL注入攻擊:簡(jiǎn)單易懂的防御方法及實(shí)踐經(jīng)驗(yàn))
新聞來(lái)源:http://www.dlmjj.cn/article/ccogihe.html


咨詢
建站咨詢
