- 首頁 > 生活 > >
SQL注入問題
- 概述:
- 首先SQL注入是一個非常危險的操作,很可能被一些不懷好意的人鉆空導致我們系統(tǒng)出現(xiàn)異常等狀況,比如數(shù)據(jù)庫遭到破壞或被入侵 。
- 原因:使用JDBC的Statement語句添加SQL語句
- 由于我們的JDBC在對數(shù)據(jù)庫進行操作時,需要客戶端傳入一些參數(shù) 。我們在日常中的處理是將字符串參數(shù)作為SQL語句進行拼接,但是加入客戶端傳入SQL語句關鍵字惡意篡改SQL語句就會改變服務端SQL語義發(fā)生系統(tǒng)異常 。嚴重時就會導致系統(tǒng)和數(shù)據(jù)庫破壞,這時的攻擊方式就叫SQL注入了 。
- 實例:模擬登錄請求傳入用戶id和密碼參數(shù),使用字符串拼接導致的SQL注入 。
- 【聊聊SQL注入】拼接SQL語句,就會出現(xiàn)SQL注入的安全問題,拼接代碼如下:
String sql = "select * from user where username='" + uid + "' and password='" + passwd + "'"; - 若此時傳入?yún)?shù)如下:永真式 或 封號結束注釋后面條件驗證(只能說人的腦洞真大哈哈)
params.put("uid", "malongfei");params.put("passwd", "111' or '1' = '1");// 或者params.put("uid", "malongfei'; -- ")// 或者params.put("uid", "malongfei'; # ") - 此時JDBC還沒意識到安全問題,依舊將以上參數(shù)拼接到我們的SQL原語中,如下:
select * from user where uid = 'malongfei' and passwd = '111' or '1' = '1';select * from user where uid = 'malongfei'; -- ' and passwd = '111' or '1' = '1';select * from user where uid = 'malongfei'; # ' and passwd = '111' or '1' = '1';
- 預防SQL注入:使用PreparedStatement代替Statement可以有效防止SQL注入 。
- PreparedStatement利用預編譯的機制將sql語句的主干和參數(shù)分別傳輸給數(shù)據(jù)庫服務器,這樣即使參數(shù)中攜帶數(shù)據(jù)庫關鍵字,也不能作為SQL中真正的關鍵字而起作用 。
// 后端登錄驗證密碼接口的SQL語句select * from user where uid = ? and passwd = ?;- 設置黑名單也可提前預防,單純針對于用戶輸入中含有SQL關鍵字的攔截方法,比如在注冊賬號時,用戶名和密碼中不能含有SQL語句關鍵字;
- 或者說在進行SQL拼接時加入邏輯處理,對傳入?yún)?shù)含有SQL關鍵字的進行報輸入異常 。
- PreparedStatement與 Statment 區(qū)別:
- 語法不同:PreparedStatement 使用預編譯的sql,而 Statment 使用靜態(tài)的sql
- 效率不同: PreparedStatement 具有 sql緩存區(qū),效率比 Statment 高
- 安全性不同:PreparedStatement 可以有效防止sql注入,而 Statment 不能
Mybatis對SQL注入的預防處理
- 出現(xiàn)SQL注入問題的原因和上面一樣,都是由于拼接SQL導致的,只不過方式不同 。
- Mybatis接收參數(shù)處理有兩種語法:
#{} 和 ${},#使用預編譯,$使用拼接SQL方式 。 - 這里需要注意的是:使用#運算符,Mybatis會將傳入的參數(shù)當成一個字符串,在進行變量替換時會加上引號!
- mybatis 出現(xiàn)SQL注入實例:
- 模糊查詢時,如下實例:
- 采用
#{} 的話程序會報異常 。最后替換成like "'name'"
select * from users where name like '%#{name}%' - 常人看了既然#{}報錯那么我用${},正中SQL注入的下懷,這個時候倘若我們的服務端 Java 代碼沒有對傳入?yún)?shù)進行攔截處理,SQL注入條件滿足!
select * from users where name like '%${name}%' - 正確SQL寫法,需要使用 concat函數(shù) 來進行連接參數(shù)(concat為mysql函數(shù),連接參數(shù)產(chǎn)生字符串)
經(jīng)驗總結擴展閱讀
-
-
-
-
-
情問 情問:如何跟互動的還不錯,但態(tài)度有一點點轉冷的女生繼續(xù)相處與來往?
-
-
-
-
-
米粥的閱讀時光 兒子新婚當晚沒讓母親住婚房,導致母子決裂。兒子:她就是變態(tài)
-
2023年2月29日星期幾 2023年2月有沒有29號
-
-
-
-
-
張檬|張檬小五疑似“婚變”,發(fā)消極動態(tài)后又刪除,兩人結婚僅2個月
-
網(wǎng)易 兩性相處,倘若男人經(jīng)常給你如此“感覺”,就別愛了
-
2023年1月1日殯葬行嗎 2023年1月1日殯葬吉日一覽表
-
-
在感情中,被發(fā)“好人卡”后,真的沒有機會在一起了嗎