在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:#預編譯是採用佔位符的方式?,$則是字符串值替換。
知識就是要不斷的學習,不斷的複習,纔會記憶的更加的深刻。加油,美好的風景一直在路上。