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

歡迎訪問 生活随笔!

生活随笔

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

数据库

mybatis如何防止SQL注入?

發布時間:2023/12/10 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis如何防止SQL注入? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • sql注入發生的時間,sql注入發生的階段在sql預編譯階段,當編譯完成的sql不會產生sql注入

一、采用jdbc操作數據時候

String sql = "update ft_proposal set id = "+id; PreparedStatement prepareStatement = conn.prepareStatement(sql); prepareStatement.executeUpdate();

preparedStatement 預編譯對象會對傳入sql進行預編譯,那么當傳入id 字符串為 “update ft_proposal set id = 3;drop table ft_proposal;” 這種情況下就會導致sql注入刪除ft_proposal這張表。

如何防止sql注入,首先將要執行sql進行預編譯,然后在將占位符進行替換

String sql = "update ft_proposal set id = ?" PreparedStatement ps = conn.preparedStatement(sql); ps.setString(1,"2"); ps.executeUpdate();

處理使用預編譯語句之外,另一種實現方式可以采用存儲過程,存儲過程其實也是預編譯的,存儲過程是sql語句的集合,將所有預編譯的sql 語句編譯完成后,存儲在數據庫上,但是由于存儲過程比較死板一般不采用這種方式進行處理。

二、mybatis是如何處理sql注入的?
假設mapper.xml文件中sql查詢語句為:

<select id="findById" resultType="String">select name from user where id = #{userid}; </select>

對應的接口為:

public String findById(@param("userId")String userId);

當傳入的參數為3;drop table user; 當我們執行時可以看見打印的sql語句為:

select name from usre where id = ?;

不管輸入何種參數時,都可以防止sql注入,因為mybatis底層實現了預編譯底層通過prepareStatement預編譯實現類對當前傳入的sql進行了預編譯,這樣就可以防止sql注入了

如果將查詢語句改寫為:

<select id="findById" resultType = "String"> select name from user where id=${userid} </select>

當輸入參數為3;drop table user; 執行sql語句為

select name from user where id = 3;drop table user ;

mybatis沒有進行預編譯語句,它先進行了字符串拼接,然后進行了預編譯。這個過程就是sql注入生效的過程。

總結

因此在編寫mybatis的映射語句時,盡量采用“#{xxx}”這樣的格式。若不得不使用“${xxx}”這樣的參數,要手工地做好過濾工作,來防止sql注入攻擊。

總結

以上是生活随笔為你收集整理的mybatis如何防止SQL注入?的全部內容,希望文章能夠幫你解決所遇到的問題。

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