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

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

原文連結:http://www.cnblogs.com/chyu/p/4389701.html

前言略,直奔主題..

#{}相當於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_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")); } 輸出結果:

[email protected]: 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"));
}

輸出結果都為:
[email protected]: select * from admin_domain_location where domain_id='2'
2
複製程式碼

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

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

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

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

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

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

相關推薦

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

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

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

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

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

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

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-

yum與apt-get的區別以及兩者更新源阿里/網易【163】

一般來說著名的linux系統基本上分兩大類: 1.RedHat系列:Redhat、Centos、Fedora等 2.Debian系列:Debian、Ubuntu等 RedHat 系列 1

分頁demo 前端+後臺 union 與union all 的區別 以及分頁limit,offset的應用

  記重點    1.UNION去重且排序,UNION ALL不去重不排序。 2. sql 中 limit 與 limit,offset連用的區別 ① select * from table limit 2,1;      

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

oracle學習筆記聚合函式以及group by having 的用法

                                                                                                           今天學習了聚合函式以及group by 的用法。      

tomcat 與 java web中url路徑的配置以及使用規則詳情長期更新

root 每一個 ava 目錄 clip ima 文件夾 logs 需要 首先我們看一下在myeclipse中建立的java web項目的結構 在這裏我們需要註意這個webroot也就是我們在tomcat裏的webapp裏面的應用 之所以每一個項目都有這個webroot

python3.6虛擬環境以及flask的安裝常見問題

python 虛擬環境 flask準備基於python進行web應用開發Python3.3以上的版本通過venv模塊原生支持虛擬環境,可以代替Python之前的virtualenv。該venv模塊提供了創建輕量級“虛擬環境”,提供與系統Python的隔離支持。每一個虛擬環境都有其自己的Python二進制(允許

Hibernate的工作流程以及三種狀態面試題

數據庫 delet 垃圾 打開 ron 工作流 沒有 flush 行數據 Hibernate的工作流程以及三種狀態 轉載自:http://www.cnblogs.com/fifiyong/p/6390699.html Hibernate的工作流程: 1. 讀取並解

白話如何在kali linux上多功能截圖以及保證筆記萬無一失安全版

note precise 點擊下載 選擇 apt original 官網 packages 商業 技術博客的可讀性非常重要,這也是技術博客寫作的重要原則。 kali linux版本為2018.1 64位 如果使用最新安裝的kali linux,你會發現系統自帶的截圖工具不是

利用CSS注入無iFrames竊取CSRF令牌

來源:FreeBuf.COM 連結:http://www.freebuf.com/articles/web/162687.html(點選尾部閱讀原文前往) *參考來源:github,FB小編 secist 編譯 CSS僅僅只是一種用來表示樣式的語言嗎?當然不是!

LeetCode演算法題-Binary Tree Level Order Traversal IIJava實現

這是悅樂書的第165次更新,第167篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第24題(順位題號是107)。給定二叉樹,返回其節點值的自下而上級別順序遍歷(即從左到右,逐層逐層)。例如: 給定二叉樹[3,9,20,null,null,15,7], 3

897. Increasing Order Search Treepython+cpp

題目: Given a tree, rearrange the tree in in-order so that the leftmost node in the tree is now the root of the tree, and every node has no

Vue實戰指南之依賴注入provide / inject

案例 UI美眉說咱家的選項選單太醜了,小哥哥能不能美化一下呀,灑家自然是說小意思啦~ 自定義一個select元件,so easy~ 簡單粗暴型: <el-select v-model="favourite" :option="[]"></el-select> option作為資

常量指標與指標常量的區別

三個名詞雖然非常繞嘴,不過說的非常準確。用中國話的語義分析就可以很方便地把三個概念區分開。 一) 常量指標。 常量是形容詞,指標是名詞,以指標為中心的一個偏正結構短語。這樣看,常量指標本質是指標,常量修飾它,表示這個指標乃是一個指向常量的指標(變數)。 指標指向的物件是常量,那麼這個物件