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-name和call-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 II(Java實現)
這是悅樂書的第165次更新,第167篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第24題(順位題號是107)。給定二叉樹,返回其節點值的自下而上級別順序遍歷(即從左到右,逐層逐層)。例如: 給定二叉樹[3,9,20,null,null,15,7], 3
897. Increasing Order Search Tree(python+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作為資
常量指標與指標常量的區別(轉帖)
三個名詞雖然非常繞嘴,不過說的非常準確。用中國話的語義分析就可以很方便地把三個概念區分開。 一) 常量指標。 常量是形容詞,指標是名詞,以指標為中心的一個偏正結構短語。這樣看,常量指標本質是指標,常量修飾它,表示這個指標乃是一個指向常量的指標(變數)。 指標指向的物件是常量,那麼這個物件