通過代碼實踐理解mybatis中的#和$區別及聯繫,一定要正確使用

在mybatis的mapper.xml中,入參我們可以用#和$符號來取,那麼,這兩個有什麼區別及聯繫呢,常說$容易帶來sql注入風險,到底是怎麼樣的呢?今天,直接通過代碼實踐,看看兩者有什麼區別。

測試數據爲:

 1:通過#取值,入參爲studentId,代碼如下:

<mapper namespace="com.example.demo.DAO.HelloWorldDAO">
    <select id="query" parameterType="String" resultType="student">
        select * from student where studentId = #{studentId}
    </select>
</mapper>

1)入參studentId如下圖所示:

運行返回結果爲:

2)入參studentId如下圖所示:

運行返回結果爲:

2:通過$取值,入參爲studentId,代碼如下:

<mapper namespace="com.example.demo.DAO.HelloWorldDAO">
    <select id="query" parameterType="String" resultType="student">
        select * from student where studentId = ${studentId}
    </select>
</mapper>

1)入參studentId如下圖所示:

運行結果如下圖:

2)入參studentId如下圖所示:

運行返回結果如下圖:結果跟預期的不同

以上測試了四種場景,可以看到其中三種場景結果跟預期相同。當用$取值,我們看到入參studentId=“15 or 1=1”的時候,竟然返回了表的全部數據,表中studentId沒有爲這個值的啊。出現這個結果,就是我們常說的sql注入,通過一些惡意的命令,破壞數據、獲取關鍵信息等。那麼,我們應該如何避免這種現象的發生呢?小夥伴看到了上面當用#取值時,即使拼接惡意命令,對返回的數據沒有影響,完成了正確的響應,有效的避免了sql注入的風險。

既然$取值的時候,存在sql注入風險,那麼$什麼時候可以用呢?like模糊查詢、order by等場景可用$取值。

總結:1:#可以有效的防止sql注入,$不能防止sql注入;

           2:#預編譯是採用佔位符的方式?,$則是字符串值替換。

知識就是要不斷的學習,不斷的複習,纔會記憶的更加的深刻。加油,美好的風景一直在路上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章