![68fe5b98a202c9b9c1e5f8300f7792b4.png](https://img-blog.csdnimg.cn/img_convert/68fe5b98a202c9b9c1e5f8300f7792b4.png)
我们看下面几行简单的代码
String sql = "select * from user where id=" + id;
一行中,id进行了直接的拼接,那么id这个参数会通过用户来传递进来,这样很容易照成sql注入,从而被黑客利用进行脱裤。
@RequestMapping("/SqlInjection/{id}") public ModelAndView SqlInjectTest(@PathVariable String id){ String mysqldriver = "com.mysql.jdbc.Driver"; String mysqlurl = "jdbc:mysql://127.0.0.1:3306/test?user=root&password=123456&useUnicode=true&characterEn coding=utf8&autoReconnect=true"; String sql = "select * from user where id=" + id; ModelAndView mav = new ModelAndView("test2"); try{ Class.forName(mysqldriver); Connection conn = DriverManager.getConnection(mysqlurl); PreparedStatement pstt = conn.prepareStatement(sql); ResultSet rs = pstt.executeQuery();
修复:
如何规避着类问题呢,最直接也是最根本的方法就是采用预处理的方法,如下代码:
@RequestMapping("/SqlInjection/{id}") public ModelAndView SqlInjectTest(@PathVariable String id){ String mysqldriver = "com.mysql.jdbc.Driver"; String mysqlurl = "jdbc:mysql://127.0.0.1:3306/test?user=root&password=123456&useUnicode=true&characterEn coding=utf8&autoReconnect=true"; String sql = "select * from user where id= ?"; ModelAndView mav = new ModelAndView("test2"); try{ Class.forName(mysqldriver); Connection conn = DriverManager.getConnection(mysqlurl); PreparedStatement pstt = conn.prepareStatement(sql);
这样id参数值就被问号进行了占位,那么在传递进来的参数都只会被当作字符串来执行,而不会被当成sql语句中的逻辑词来执行。
总结:
毫无疑问,着类比较低级的错误往往是发生在java开发的菜鸟或者新手身上,那些有着多年开发的老鸟们闭着眼睛都不会这么写。所有刚入门的java开发小白们,一定在学习开发过程中涉及点安全知识,不然你写出来的代码简直是写的漏洞啊。