所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
☛应用场景:现在有一张员工表,包含员工的信息,每个员工只能查询自己的相关信息,不能查看别的信息。
测试表数据:
mysql> select * from employee;o
+-----+------------------------+------+------------+---------+
| eid | ename | esex | etel | esalary |
+-----+------------------------+------+------------+---------+
| 1 | Satement测试sql注入 | 男 | 1234566 | 20000 |
| 2 | PerSatement测试sql注入 | 男 | 1552585445 | 25852 |
+-----+------------------------+------+------------+---------+
2 rows in set (0.00 sec)
场景一:从键盘中输入员工姓名(‘Satement测试sql注入 ’ or 1 =‘1’)查询信息(Statement)
package com.daxia.test02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
public class InsertTest {
public static void main(String[] args) throws Exception {
// 从键盘输入
Scanner input = new Scanner(System.in);
System.out.print("请输入姓名:");
String name = input.nextLine(); //Satement测试sql注入' or 1 ='1
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.连接服务器
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/coding0110lindb", "root", "root");
// 3.编写sql
String sql = "select * from employee where ename='" + name + "'";
// 4.创建Statement
Statement st = con.createStatement();
// 5.执行sql
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
/*
* ==========优化 ===================
* rs.getObject("eid");
* rs.getObject("ename");
* rs.getObject("esex");
* rs.getObject("etel");
* rs.getObject("esalary");
*/
for (int i = 1; i <= 5; i++) { // 数据库中有5个字段
Object object = rs.getObject(i);
System.out.print(object + "|"); // 打印数据库中每行的字段值
}
System.out.print("\n");// 换行
}
// 6.释放
rs.close();
con.close();
input.close();
}
}
select * from employee where ename= 'Satement测试sql注入';
①从键盘中输入员工姓名(Satement测试sql注入)查询信息
eclipse输入输出控制台:
/*
请输入姓名:Satement测试sql注入
1|Satement测试sql注入|男|1234566|20000.0|
*/
mysql> select * from employee where ename= 'Satement测试sql注入';
+-----+---------------------+------+---------+---------+
| eid | ename | esex | etel | esalary |
+-----+---------------------+------+---------+---------+
| 1 | Satement测试sql注入 | 男 | 1234566 | 20000 |
+-----+---------------------+------+---------+---------+
1 row in set (0.00 sec)
②从键盘中输入员工姓名(Satement测试sql注入 ’ or 1 ='1)查询信息
在查询时,输入恶意的SQL命令(’ or 1 ='1)时出现SQL注入情况,查询个人信息,却查询出全部信息,这样的语句就存在安全隐患!
eclipse输入输出控制台:
请输入姓名:Satement测试sql注入' or 1 ='1
1|Satement测试sql注入|男|1234566|20000.0|
2|PerSatement测试sql注入|男|1552585445|25852.|
mysql> select * from employee where ename='Satement测试sql注入' or 1 ='1';
+-----+------------------------+------+------------+---------+
| eid | ename | esex | etel | esalary |
+-----+------------------------+------+------------+---------+
| 1 | Satement测试sql注入 | 男 | 1234566 | 20000 |
| 2 | PerSatement测试sql注入 | 男 | 1552585445 | 25852 |
+-----+------------------------+------+------------+---------+
2 rows in set (0.00 sec)
场景二::从键盘中输入员工姓名(Satement测试sql注入 ’ or 1 ='1)查询信息(PreparedStatement)
package com.daxia.test02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
public class InsertTest {
public static void main(String[] args) throws Exception {
// 从键盘输入
Scanner input = new Scanner(System.in);
System.out.print("请输入姓名:");
// String name = input.next();
String name = input.nextLine(); // Satement测试sql注入' or 1 ='1
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.连接服务器
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/coding0110lindb", "root", "root");
// 3.编写sql
String sql = "select * from employee where ename=?";
// 4.创建Statement
PreparedStatement ps = con.prepareStatement(sql);
// 设置?
ps.setObject(1, name);
// 5.执行sql
ResultSet rs = ps.executeQuery();
if (rs.next()) {
for (int i = 1; i <= 5; i++) { // 数据库中有5个字段
Object object = rs.getObject(i);
System.out.print(object + "|"); // 打印数据库中每行的字段值
}
System.out.print("\n");// 换行
}else{
System.out.print("您输入的"+name+"查询不到!");//测试操作
}
// 6.释放
rs.close();
ps.close();
con.close();
input.close();
/*
* 请输入姓名:Satement测试sql注入 1|Satement测试sql注入|男|1234566|20000.0|
*/
}
}
①从键盘中输入员工姓名(Satement测试sql注入)查询信息
eclipse输入输出控制台:
请输入姓名:Satement测试sql注入
1|Satement测试sql注入|男|1234566|20000.0|
②从键盘中输入员工姓名(Satement测试sql注入 ’ or 1 ='1)查询信息
eclipse输入输出控制台:
请输入姓名:Satement测试sql注入' or 1 ='1
您输入的Satement测试sql注入' or 1 ='1查询不到!
总结:
为了防止客户端访问后台数据库服务器出现恶意篡改sql语句现象,我们程序员在Java编写代码时就应该对sql语句进行管理控制,用占位符?进行拼串,防止这种情况的发现,这种是毁灭性的。
#轻松一刻:
☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!
☞本人博客:https://coding0110lin.blog.csdn.net/ 欢迎转载,一起技术交流吧!