在编写Java代码时,我们如何改进连接数据库sql拼串语句来预防SQL注入?

参照-科普中国▪科学百科-sql注入定义

所谓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/  欢迎转载,一起技术交流吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值