天天看點

# 和$的差別

推薦能使用#就不要使用 $

a.#{ }

1.相當于JDBC中的PreparedStatement ,是經過預編譯的,安全

2.會為參數自動拼接引号

3.執行sql效果

select * from user where uid="1" and username="cathy"
           

b.${ }

1.相當于JDBC中的Statement ,未經過預編譯,非安全,存在sql注入危險

2.并不會給參數自動拼接引号

3.執行sql效果

select * from user where uid=1 and username=cathy
           

寫一個sql注入的例子

假設該表中有1個使用者,賬号為cathy,密碼為:pwd123

理想查詢條件應為

select * from user where username=cathy and password=pwd123
           

背景sql代碼

String sql = "SELECT * " +
                 "FROM user "+
                 "WHERE username='"+userName+"' " +
                 "AND password='"+password+"'";
           

但是如果使用者惡意輸入:

使用者名:随便輸

密碼 :’ OR ‘1’='1

那麼實際查詢的sql為

select * from user where username='lalalala' and password='' or '1'='1'
           

能顯示登入,此則為sql注入攻擊