日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql order by sql注入_mybatis中#{}和${}的区别及order by的sql注入问题

發布時間:2023/12/19 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql order by sql注入_mybatis中#{}和${}的区别及order by的sql注入问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言略,直奔主題..

#{}相當于jdbc中的preparedstatement

${}是輸出變量的值

簡單的說就是#{}傳過來的參數帶單引號'',而${}傳過來的參數不帶單引號。

你可能說不明所以,不要緊我們看2段代碼:

String sql = "select * from admin_domain_location order by ?";

PreparedStatement st = con.prepareStatement(sql);

st.setString(1, "domain_id");

System.out.println(st.toString());

ResultSet rs = st.executeQuery();

while(rs.next()){

System.out.println(rs.getString("domain_id"));

}

輸出結果:

com.mysql.jdbc.PreparedStatement@1fa1ba1: select * from admin_domain_location?order by?'domain_id'

3

4

5

2

6

這是個jdbc的preparedstatement例子,不要吐槽我這么寫是否合法,這里只是為了說明問題.

以上例子有得出以下信息:?1)?order by后面如果采用預編譯的形式動態輸入參數,那么實際插入的參數是一個字符串,例子中是:order by??'domain_id'

2)輸出結果并沒有排序,從sql語句中的形式我們也可以推測出此sql語句根本也不合法(正常應該是 order by?domain_id?)

修改以上代碼如下:

String input = "domain_id";

String sql = "select * from admin_domain_location order by "+input;

PreparedStatement st = con.prepareStatement(sql);

System.out.println(st.toString());

ResultSet rs = st.executeQuery();

while(rs.next()){

System.out.println(rs.getString("domain_id"));

}

輸出結果:

com.mysql.jdbc.PreparedStatement@1fa1ba1: select * from admin_domain_location?order by domain_id

2

3

4

5

6

此次我們直接把一個變量的值拼接sql語句,從結果可以看出來:

1)sql語句拼接正常

2)查詢結果排序正常

你可能要問這和#{}與${}有什么關系..

上面已經說過#{}相當于jdbc的preparedstatement,所以以上的第一個例子就相當于#{},那么第二個例子就自然而然指的是${}的情況.

你可能說思維還是有些凌亂,不要緊我們來看第三個例子:

String sql = "select * from admin_domain_location where domain_id=?";

PreparedStatement st = con.prepareStatement(sql);

st.setString(1, "2");

System.out.println(st.toString());

ResultSet rs = st.executeQuery();

while(rs.next()){

System.out.println(rs.getString("domain_id"));

}

=======================================

String input = "2";

String sql = "select * from admin_domain_location where domain_id='"+input+"'";

PreparedStatement st = con.prepareStatement(sql);

System.out.println(st.toString());

ResultSet rs = st.executeQuery();

while(rs.next()){

System.out.println(rs.getString("domain_id"));

}

輸出結果都為:

com.mysql.jdbc.PreparedStatement@12bf560: select * from admin_domain_location where domain_id='2'

2

這第三個例子雖然說的是#{}和${}通用的問題,也就是說在此種情況下#{}和${}是通用的,只不過需要些小的轉換.如例子中需要手動

拼接單引號 ' ' 到變量值的前后,確保sql語句正常.

簡單說#{}是經過預編譯的,是安全的,而${}是未經過預編譯的,僅僅是取變量的值,是非安全的,存在sql注入.

這里先說一下只能${}的情況,從我們前面的例子中也能看出,order by是肯定只能用${}了,用#{}會多個' '導致sql語句失效.此外還有一個like 語句后也需要用${},簡單想一下

就能明白.由于${}僅僅是簡單的取值,所以以前sql注入的方法適用此處,如果我們order by語句后用了${},那么不做任何處理的時候是存在sql注入危險的.你說怎么防止,那我只

能悲慘的告訴你,你得手動處理過濾一下輸入的內容,如判斷一下輸入的參數的長度是否正常(注入語句一般很長),更精確寫查詢一下輸入的參數是否在預期的參數集合中..

總結

以上是生活随笔為你收集整理的mysql order by sql注入_mybatis中#{}和${}的区别及order by的sql注入问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。