1. 程式人生 > >mybatis中 # 號和 $ 符的區別

mybatis中 # 號和 $ 符的區別

mybatis#號和$符的區別?

區別

1 #是將傳入的值當做字串的形式,eg:select id,name,age from student where id =#{id},當前端把id值1,傳入到後臺的時候,就相當於

select id,name,age from student where id ='1'.

使用#可以很大程度上防止sql注入。(語句的拼接) ,

為什麼#可以防止sql注入:mybatis中#不會對傳值做處理,$會對特殊字元過濾

2 & 是將傳入的資料直接顯示生成sql語句,, 當前端把id值1,傳入到後臺的時候,就相當於

eg: select
id,name,age from student where id =${id} select id,name,age from student where id = 1.

SQL注入

就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令

預防

1.(簡單又有效的方法)PreparedStatement

採用預編譯語句集,它內建了處理SQL注入的能力,只要使用它的setXXX方法傳值即可。

使用好處:

(1).程式碼的可讀性和可維護性.

(2).PreparedStatement盡最大可能提高效能.

(3).最重要的一點是極大地提高了安全性.

原理:

sql注入只對sql語句的準備(編譯)過程有破壞作用

而PreparedStatement已經準備好了,執行階段只是把輸入串作為資料處理,

而不再對sql語句進行解析,準備,因此也就避免了sql注入問題.

2.使用正則表示式過濾傳入的引數

要引入的包:

import java.util.regex.*;

正則表示式:

private String CHECKSQL = “^(.+)\sand\s(.+)|(.+)\sor(.+)\s$”;

判斷是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具體的正則表示式:

檢測SQL meta-characters的正則表示式 :

/(%27)|(\’)|(--)|(%23)|(#)/ix

典型的SQL 注入攻擊的正則表示式 :/\w*((%27)|(\’))((%6F)|o|(%4F))((%72)|r|(%52))/ix

檢測SQL注入,UNION查詢關鍵字的正則表示式 :/((%27)|(\’))union/ix(%27)|(\’)

檢測MS SQL Server SQL注入攻擊的正則表示式:

/exec(\s|+)+(s|x)p\w+/ix