1. 程式人生 > >mybatis的#{}和${}的區別以及order by注入問題

mybatis的#{}和${}的區別以及order by注入問題



由於不想註冊,轉載以上地址的文章。在此感謝此位網友分享。

前言略,直奔主題..

#{}相當於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"));

}

輸出結果:

[email protected]: select * from admin_domain_locationorder by'domain_id'

3

4

5

2

6

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

以上例子有得出以下資訊:1)order by後面如果採用預編譯的形式動態輸入引數,那麼實際插入的引數是一個字串,例子中是:order by 'domain_id'

2)輸出結果並沒有排序,從sql語句中的形式我們也可以推測出此sql語句根本也不合法(正常應該是 order bydomain_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")); } 輸出結果:

[email protected]: select * from admin_domain_locationorder 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"));
}
輸出結果都為:
[email protected]12bf560: select * from admin_domain_location where domain_id='2'
2

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

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

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

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

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

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

相關推薦

MyBatis排序時使用order by 動態引數時需要注意,用$而不是#, #{}${}的區別以及order by注入問題

ORDER BY ${columnName}這裡MyBatis不會修改或轉義字串。重要:接受從使用者輸出的內容並提供給語句中不變的字串,這樣做是不安全的。這會導致潛在的SQL注入攻擊,因此你不應該允許使用者輸入這些欄位,或者通常自行轉義並檢查。 #{}相當於jdbc中的

mybatis的#{}${}的區別以及order by注入問題

 由於不想註冊,轉載以上地址的文章。在此感謝此位網友分享。 前言略,直奔主題.. #{}相當於jdbc中的preparedstatement ${}是輸出變數的值 你可能說不明所以,不要緊我們看2段程式碼: String sql = "select * from a

mybatis的#{}${}的區別以及order by注入問題(轉錄)

原文連結:http://www.cnblogs.com/chyu/p/4389701.html 前言略,直奔主題.. #{}相當於jdbc中的preparedstatement ${}是輸出變數的值 你可能說不明所以,不要緊我們看2段程式碼: String

Mybatis中#{}${}的區別以及對sql注入、預編譯、jdbcType的說明

#{}和${}都可以獲取map中的值或者pojo物件屬性的值; sql語句示例: select * from tbl_employee where id=${id} and last_name=#{lastName} Preparing: select * from tbl_employee

scala def/val/lazy val區別以及call-by-namecall-by-value

ID sta 立即執行 學習 新的 com AR csdn 重新 scala 學習 參考鏈接:https://blog.csdn.net/qq_29343201/article/details/56281777 scala def/val/lazy val區別以及call-

Mysql Order By注入總結

何為order by 注入 本文討論的內容指可控制的位置在order by子句後,如下order引數可控"select * from goods order by $_GET['order']" 簡單注入判斷 在早期注入大量存在的時候利用order by子句進行快速猜解列數,再配合union select語

關於order by注入利用rand(true)的一個疑問

order by的一個利用方式是使用 rand(true) rand(false) 返回排序不同進行盲注, rand((select char(substring(table_name,1,1)) from information_schema.tables limit 1

MyBatis排序時使用order by 動態引數時需要注意,用$而不是#

字串替換預設情況下,使用#{}格式的語法會導致MyBatis建立預處理語句屬性並以它為背景設定安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時你只是想直接在SQL語句中插入一個不改變的字串。比如,像ORDER

SQL UnionSQL Union All兩者用法區別效率以及order by group by配合問題

SQL UNION 操作符 UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。 請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每條 SELECT 語句中的列的順序必須相同。 SQL UNION

Mybatis中的#{}與${}區別以及什麼是SQL注入

今天搞懂了一個問題,就是在使用Mybatis時#{}與${}到底有什麼區別?原來也看過別人的部落格,感覺總是迷迷糊糊(原諒我是菜鳥),今天把這個問題整理了一遍,水平有限,各位大佬如果發現錯誤的地方請指正1,首先Mybatis中的#{}與${}到底有什麼區別?其實,區別就是如果

mybatis.xml文件中#與$符號的區別以及數學符號的處理

文件 integer order by rep select map 以及 方式 動態 1. #{}表示一個占位符號,通過#{}可以實現preparedStatement向占位符中設置值,自動進行java類型和jdbc類型轉換,#{}可以有效防止sql註入。 #{}可以接收

mybatis深入理解之 # 與 $ 區別以及 sql 預編譯

tcl nec from esql 校驗 ntp code 理解 替換字符串 mybatis 中使用 sqlMap 進行 sql 查詢時,經常需要動態傳遞參數,例如我們需要根據用戶的姓名來篩選用戶時,sql 如下: select * from user where nam

Hive中order by,sort by, distribute by, cluster by區別,用法詳解

1. order by     Hive中的order by跟傳統的sql語言中的order by作用是一樣的,會對查詢的結果做一次全域性排序,所以說,只有hive的sql中制定了order by所有的資料都會到同一個reducer進行處理(不管有多少map,也不管檔案有多少

hive中 order by ,distribute by ,cluster by ,sort by 區別

id name old 1 張三 10 1 李四 15 3 王五 20 4 趙

linq中order by group by (含lambda表示式實現)以及綜合案例

一、Linq對誰適用 linq的語法通過System.Linq下面的Enumerable類提供支援,也就是說,只要是實現了IEnumerable<T>的物件都可以使用Linq的語法來查詢。LINQ定義了大約40個查詢操作符,如select、from、in、where、group by 以及ord

order by ground by 區別

order by 排序查詢:asc升序 desc降序 select * from Student order by age根據學生的年齡查詢學生資訊(預設是升序) ground by:分組查詢 having只能用於ground by子句作用於組內 按照

使用mybatis查出資料與mysql查出來的不一致(order by)

最近在練習easyui的時候做到datagrid的時候 用到點選欄位進行 降序,升序 的時候發現無論怎麼點 資料都不會變, 開始以為是easyui-datagrid中配置錯了,改了半天也沒有發現.  然後去看了下mybatis發出的sql和查詢結果. 查出來才發現 不是easyui

MyBatis】sql語句中的按時間排序無效問題order by create_time desc

mybatis的mapper檔案中書寫sql語句,但是根據時間倒序查詢的order by create_time 突然無效了,這是為什麼?導致無效的原因:時間格式做了改變,時間欄位別名和原始欄位重名,導

statementpreparedstatement的區別以及sql注入的預防

Statement 和 PreparedStatement之間的關係和區別. 關係:PreparedStatement繼承自Statement,都是介面 區別:PreparedStatement可以使用佔位符,是預編譯的,批處理比Statem

淺談group byorder by的用法區別

前一段時間的面試,問道這個問題,不太清楚了,感覺有必要來總結一下。話不多說,直接開始吧! 一、order by的用法 使用order by,一般是用來,依照查詢結果的某一列(或多列)屬性,進行排序(升序:ASC;降序:DESC;預設為升序)。 當排序列含空值時: ASC: