如何实现有效防止sql注入的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
sql注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想获取的数据,这就是所谓的sql注入,即sql注入。
假如某高校开发了一个网课系统,要求学生选课后完成学习,数据库中有一张表<代码> 代码>,这张表存放着每个学生的选课信息及完成情况,具体设计如下:
数据如下:
本系统采用mysql做为数据库,使用Jdbc来进行数据库的相关操作。系统提供了一个功能查询该学生的课程完成情况,代码如下。
@RestController 公共类控制器{ @ autowired SqlInject SqlInject; @GetMapping (“list") 公共ListcourseList (@RequestParam (“studentId")字符串studentId) { List 订单=sqlInject.orderList (studentId); 返回订单; } }
@ service 公开课SqlInject { @ autowired 私人JdbcTemplate JdbcTemplate; 公共ListorderList(字符串studentId) { 字符串sql=把≡駃d、course_id student_id,地位从课程student_id=? studentId; jdbcTemplate返回。查询(sql,新BeanPropertyRowMapper (Course.class)); } }
1。正常情况下查询一个学生所选课程及完成情况只需要传入student_id,便可以查到相关数据。
根据响应结果,我们很快便能写出对应的sql,如下:
选择id、course_id student_id,地位 从课程 student_id=4
2。如果我们想要获取这张表的所有数据,只需要保证上面这个sql的条件恒真就可以了。
选择id、course_id student_id,地位 从课程 student_id=4或者1=1
请求接口的时候将studendId设置为4或者1=1,这样这条sql的条件就恒真了. sql也就等同于下面这样
选择id、course_id student_id,地位 从课程
请求结果如下,我们拿到了这张表的所有数据
3。查询mysql版本号,使用联盟拼接sql
4。查询数据库名
5。查询mysql当前用户的所有库
看完上面这些演示后,你害怕了吗?你所有的数据配置都完全暴露出来了,除此之外,还可以完成很多操作,更新数据,删库,删表等等。
1。代码层防止sql注入攻击的最佳方案就是sql预编译
如何实现有效防止sql注入的方法