最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單了解Mybatis如何實現(xiàn)SQL防注入

 更新時間:2020年01月07日 09:07:11   作者:蒙娜麗莎法師  
這篇文章主要介紹了簡單了解Mybatis如何實現(xiàn)SQL防注入,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了簡單了解Mybatis如何實現(xiàn)SQL防注入,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

Mybatis這個框架在日常開發(fā)中用的很多,比如面試中經常有一個問題:$和#的區(qū)別,它們的區(qū)別是使用#可以防止SQL注入,今天就來看一下它是如何實現(xiàn)SQL注入的。

什么是SQL注入

在討論怎么實現(xiàn)之前,首先了解一下什么是SQL注入,我們有一個簡單的查詢操作:根據id查詢一個用戶信息。它的sql語句應該是這樣:select * from user where id =。我們根據傳入條件填入id進行查詢。

如果正常操作,傳入一個正常的id,比如說2,那么這條語句變成select * from user where id =2。這條語句是可以正常運行并且符合我們預期的。

但是如果傳入的參數變成'' or 1=1,這時這條語句變成select * from user where id = '' or 1=1。讓我們想一下這條語句的執(zhí)行結果會是怎么?它會將我們用戶表中所有的數據查詢出來,顯然這是一個大的錯誤。這就是SQL注入。

Mybatis如何防止SQL注入

在開頭講過,可以使用#來防止SQL注入,它的寫法如下:

<select id="safeSelect" resultMap="testUser">
  SELECT * FROM user where id = #{id}
</select>

在mybatis中查詢還有一個寫法是使用$,它的寫法如下:

<select id="unsafeSelect" resultMap="testUser">
  select * from user where id = ${id}
</select>

當我們在外部對這兩個方法繼續(xù)調用時,發(fā)現(xiàn)如果傳入安全的參數時,兩者結果并無不同,如果傳入不安全的參數時,第一種使用#的方法查詢不到結果(select * from user where id = '' or 1=1),但這個參數在第二種也就是$下會得到全部的結果。

并且如果我們將sql進行打印,會發(fā)現(xiàn)添加#時,向數據庫執(zhí)行的sql為:select * from user where id = ' \'\' or 1=1 ',它會在我們的參數外再加一層引號,在使用$時,它的執(zhí)行sql是select * from user where id = '' or 1=1。

棄用$可以嗎

我們使用#也能完成$的作用,并且使用$還有危險,那么我們以后不使用$不就行了嗎。

并不是,它只是在我們這種場景下會有問題,但是在有一些動態(tài)查詢的場景中還是有不可代替的作用的,比如,動態(tài)修改表名select * from ${table} where id = #{id}。我們就可以在返回信息一致的情況下進行動態(tài)的更改查詢的表,這也是mybatis動態(tài)強大的地方。

如何實現(xiàn)SQL注入的,不用Mybatis怎么實現(xiàn)

其實Mybatis也是通過jdbc來進行數據庫連接的,如果我們看一下jdbc的使用,就可以得到這個原因。

#使用了PreparedStatement來進行預處理,然后通過set的方式對占位符進行設置,而$則是通過Statement直接進行查詢,當有參數時直接拼接進行查詢。

所以說我們可以使用jdbc來實現(xiàn)SQL注入。

看一下這兩個的代碼:

public static void statement(Connection connection) {
 System.out.println("statement-----");
 String selectSql = "select * from user";
 // 相當于mybatis中使用$,拿到參數后直接拼接
 String unsafeSql = "select * from user where id = '' or 1=1;";
 Statement statement = null;
 try {
  statement = connection.createStatement();
 } catch (SQLException e) {
  e.printStackTrace();
 }
 try {
  ResultSet resultSet = statement.executeQuery(selectSql);
  print(resultSet);
 } catch (SQLException e) {
  e.printStackTrace();
 }
 System.out.println("---****---");
 try {
  ResultSet resultSet = statement.executeQuery(unsafeSql);
  print(resultSet);
 } catch (SQLException e) {
  e.printStackTrace();
 }
}

public static void preparedStatement(Connection connection) {
 System.out.println("preparedStatement-----");
 String selectSql = "select * from user;";
 //相當于mybatis中的#,先對要執(zhí)行的sql進行預處理,設置占位符,然后設置參數
 String safeSql = "select * from user where id =?;";
 PreparedStatement preparedStatement = null;
 try {
  preparedStatement = connection.prepareStatement(selectSql);
  ResultSet resultSet = preparedStatement.executeQuery();
  print(resultSet);
 } catch (SQLException e) {
  e.printStackTrace();
 }
 System.out.println("---****---");
 try {
  preparedStatement = connection.prepareStatement(safeSql);
  preparedStatement.setString(1," '' or 1 = 1 ");
  ResultSet resultSet = preparedStatement.executeQuery();
  print(resultSet);
 } catch (SQLException e) {
  e.printStackTrace();
 }
}

public static void print(ResultSet resultSet) throws SQLException {
 while (resultSet.next()) {
  System.out.print(resultSet.getString(1) + ", ");
  System.out.print(resultSet.getString("name") + ", ");
  System.out.println(resultSet.getString(3));
 }
}

總結

  • Mybatis中使用#可以防止SQL注入,$并不能防止SQL注入
  • Mybatis實現(xiàn)SQL注入的原理是調用了jdbc中的PreparedStatement來進行預處理。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 解決IDEA2020.2插件lombok報錯問題(親測有效)

    解決IDEA2020.2插件lombok報錯問題(親測有效)

    這篇文章主要介紹了解決IDEA2020.2插件lombok報錯問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • MyBatis之傳入參數為list、數組、map的寫法

    MyBatis之傳入參數為list、數組、map的寫法

    這篇文章主要介紹了MyBatis之傳入參數為list、數組、map的寫法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java如何批量執(zhí)行datax腳本

    Java如何批量執(zhí)行datax腳本

    這篇文章主要介紹了Java如何批量執(zhí)行datax腳本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Spring中@Lazy注解的使用示例教程

    Spring中@Lazy注解的使用示例教程

    Spring在應用程序上下文啟動時去創(chuàng)建所有的單例bean對象, 而@Lazy注解可以延遲加載bean對象,即在使用時才去初始化,這篇文章主要介紹了Spring中@Lazy注解的使用,需要的朋友可以參考下
    2023-06-06
  • 如何使用 IntelliJ IDEA 編寫 Spark 應用程序(Scala + Maven)

    如何使用 IntelliJ IDEA 編寫 Spark 應用程序(Sc

    本教程展示了如何在IntelliJIDEA中使用Maven編寫和運行一個簡單的Spark應用程序(例如WordCount程序),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • SpringMVC項目訪問controller時候報404的解決

    SpringMVC項目訪問controller時候報404的解決

    這篇文章主要介紹了SpringMVC項目訪問controller時候報404的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • IDEA?設置?SpringBoot?logback?彩色日志的解決方法?附配置文件

    IDEA?設置?SpringBoot?logback?彩色日志的解決方法?附配置文件

    這篇文章主要介紹了IDEA?設置?SpringBoot?logback?彩色日志(附配置文件)的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-12-12
  • Java使用線程池實現(xiàn)socket編程的方法詳解

    Java使用線程池實現(xiàn)socket編程的方法詳解

    這篇文章主要為大家詳細介紹了Java使用線程池實現(xiàn)socket編程的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 基于SpringBoot制作一個PDF切圖小工具

    基于SpringBoot制作一個PDF切圖小工具

    這篇文章主要為大家詳細介紹了如何基于SpringBoot制作一個PDF切圖小工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • Java線程編程中Thread類的基礎學習教程

    Java線程編程中Thread類的基礎學習教程

    這篇文章主要介紹了Java線程編程中Thread類的基礎學習教程,Thread類包含諸多操作線程的方法,非常重要,需要的朋友可以參考下
    2015-12-12

最新評論

霍州市| 千阳县| 信丰县| 浦城县| 乐亭县| 固始县| 娱乐| 南安市| 林西县| 朝阳市| 镇赉县| 阳信县| 肇州县| 邢台市| 工布江达县| 边坝县| 兴化市| 屏东县| 新竹县| 白水县| 景德镇市| 白山市| 红河县| 许昌市| 广灵县| 衡阳县| 和平区| 尤溪县| 宣武区| 宜阳县| 朝阳区| 兴安盟| 萍乡市| 京山县| 玉龙| 中超| 晋城| 南城县| 黑水县| 朝阳县| 绥中县|