如何实现有效防止sql注入的方法

  介绍

如何实现有效防止sql注入的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!

sql注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想获取的数据,这就是所谓的sql注入,即sql注入。

假如某高校开发了一个网课系统,要求学生选课后完成学习,数据库中有一张表<代码> ,这张表存放着每个学生的选课信息及完成情况,具体设计如下:

如何实现有效防止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注入的方法

根据响应结果,我们很快便能写出对应的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,地位
  从课程

请求结果如下,我们拿到了这张表的所有数据

如何实现有效防止sql注入的方法

3。查询mysql版本号,使用联盟拼接sql

 

4。查询数据库名

 

5。查询mysql当前用户的所有库

 

看完上面这些演示后,你害怕了吗?你所有的数据配置都完全暴露出来了,除此之外,还可以完成很多操作,更新数据,删库,删表等等。

1。代码层防止sql注入攻击的最佳方案就是sql预编译

如何实现有效防止sql注入的方法