【JavaWeb】sql注入是个什么东西?

一、sql注入什么东西

我们用的很多软件,都有一个用户名和密码,用户的很多数据都是被存在该软件服务器里面的。
用户登录时需要保证用户名和密码正确才能登录成功。
好,现在我们来模拟这一场景。
用sql语句创建一个用户信息表,然后添加数据。
在这里插入图片描述
现在要模拟用户登录的案例,业务逻辑如下:

  • 用户名是唯一的。
  • 用户登录要保证用户名和密码都要正确,缺一不可。
  • 查询数据库中同时满足该用户名和密码的数据数量。
  • 如果数量为1,登录成功并提醒用户。
  • 否则登录失败并提示用户检查用户名和密码。

在这里插入图片描述
补充一个知识:ResultSet的知识

我们执行某些SQL查询(通常是SELECT查询)时,它们返回表格数据。
java.sql.ResultSet接口表示由SQL语句返回的此类表格数据。
即ResultSet对象保存执行需要数据库的语句的方法返回的表格数据(通常是Statement接口的executeQuery()方法)。
ResultSet对象具有指向当前行的光标/指针。最初,此光标位于第一行之前。
在这里插入图片描述
ResultSet接口的next()方法执行的时候,将当前(ResultSet)对象的指针从当前位置移到下一行。
即,第一次调用next()方法时,结果集指针/光标将移动到第一行(从默认位置开始)。
并在第二次调用next()方法时,结果集光标将移至第二行。
此方法会返回一个布尔值,该值指定ResultSet对象是否包含更多行。如果当前位置旁边没有行,则此方法返回false,否则返回true。

①获取连接、创建执行语句对象
利用jdbc工具类,直接获取连接,同时创建执行语句对象。

②编写sql语句并执行
sql语句在Java中是以一个字符串的形式而编写的,所以要将其意义完成转换。
同时因为name和pwd是两个变量,要将其拼接起来。

在这里插入图片描述
在Java中写sql语句的时候,可以先在数据库中编写好并执行看看有没有问题。
若是没有问题,再将其拼接成对应的Java字符串。

③处理结果
我们查询的是满足条件的数据数量,也就是count(),调用getInt(count())方法可以得到满足条件的数据数量,根据业务逻辑:如果为1,登录成功;否则登录失败。

二、测试以及SQL注入

我们做个测试。
在这里插入图片描述

①用户名密码表中存在
所以登录成功。

②密码1234是不正确的
所以登录失败,那么,现在问题来了,看③中密码1234是不正确的,为何登录成功了呢?
猫腻就出现在用户名上,这个用户名叫String nusename=“liuxiaoai’- -”,- -这里是连接的两个横线字符
)将用户名密码带入Java字符串中,再转换成sql语句。
在这里插入图片描述

–”在sql中是注释,将后面的语句给注释掉了。
等于是只要保证前面的用户名正确,后面密码是啥都无所谓,不写都行。
简单地理解也就是:
用户在提交数据时人为地添加一些特殊字符,使得sql语句的结构发生了变化。
最终可以在没有用户名或者密码的情况下进行登录,同时也可以完成恶意攻击。
那该如何防范呢?就是使用预编译。

三、预编译

预编译、顾名思义也就是预先编译,代码如下:
在这里插入图片描述
①占位符
?是一个占位符,表示所在的位置是一个参数。
它有一个非常强大的作用在于,占位符里的参数,必然会是普通字符串。
什么意思呢?我们以前学过转义字符。本来“- -”在sql中是注释的意思,但是通过占位符将其转义成一个普通的字符了,不具有注释的作用了。

②预编译
预编译等于是将sql语句提前了,先编译再设置参数,以前执行sql语句是在调用executeQuery()方法时,其中PreparedStatement是Statement的一个子接口。prepared,也就是准备、预先的意思。

③参数索引
setString()方法就是给占位符赋具体的值,参数表示的是sql语句中“?”占位符的索引:
1表示的第一个问号是name;
2表示的是第二个问号表示的是pwd。
其中索引从左开始从1开始数起。
以上便是对sql注入以及其防范措施预编译的说明,预编译能防范sql注入,效率还高,很是实用。

总结

提前将sql语句传入PreparedStatement中编译,等会要传入的参数使用?代替,那么该sql语句会进行预编译,编译之后就是一个需要传递参数的sql语句,(例如:select * from user where id=? )之后将前台获取的参数通过set方式传入编译后的sql语句中,这样的话就避免了特殊字符在编译阶段篡改sql而导致的sql注入问题,而且使用PreparedStatement在一定程度上有助于数据库执行性能的提升。

猜你喜欢

转载自blog.csdn.net/wang_qiu_hao/article/details/125202559