java jdbc连接数据库以及sql注入演示与防止

jdbc连接数据库

一、无法防止sql注入

package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

import com.sun.java_cup.internal.runtime.Symbol;


/**
 * 使用jdbc连接数据库
 * @author Administrator
 *
 */
public class UseJdbc {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
//		Driver driver = null;
//		1、加载驱动
		Class.forName("com.mysql.jdbc.Driver");
//		DriverManager.registerDriver(driver);
//		2、获取数据库连接对象
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","root");
//		3、获取执行sql语句的对象
		Statement statement = conn.createStatement();//不能防止sql注入
//		4、执行sql语句
		//4.1增删改操作,以删除为例
		String sqlDelete = "delete from student where id = 4";
		int i = statement.executeUpdate(sqlDelete);//返回值类型为int表示数据库中受影响条数
		System.out.println("sql删除语句受影响数据条数="+i);
		//4.2查询操作
		String sqlSelect = "select * from student";
		ResultSet resultSet = statement.executeQuery(sqlSelect);//返回值类型为结果集(结果集内存了查询结果)
//		5、解析结果集(只有执行查询操作才需要)
		while(resultSet.next()) {
			System.out.println("id="+resultSet.getInt(1)+" name="+resultSet.getString(2)+" age="+resultSet.getString(3)+" sex="+resultSet.getString(4));
		}
		
//		sql注入演示,通过名称查询学生
		System.out.println("请输入学生姓名:");
		Scanner scanner = new Scanner(System.in);
		String name = scanner.nextLine();
		String sql = "select * from student where name='"+name+"'";
		System.out.println(sql);
		resultSet=statement.executeQuery(sql);
		while(resultSet.next()) {
			System.out.println("id="+resultSet.getInt(1)+" name="+resultSet.getString(2)+" age="+resultSet.getString(3)+" sex="+resultSet.getString(4));
		}
//		6、释放资源
		resultSet.close();
		statement.close();
		conn.close();
	}
}

运行结果:
在这里插入图片描述通过结果可以看到,本来想要输入一个用户名查询到一个用户信息,但是由于输入的是:张三’ or ‘1’='1;通过拼接后将要执行的sql语句是:select * from student where name=‘张三’ or ‘1’=‘1’。条件是恒真的,所以就会获取到所有所有用户的信息。如果使用在用户登录的时候,用户在密码后面添加一些语句使得恒真,那么将可以使用任意密码登录。

二、如何解决sql注入问题:
获取执行sql语句对象的时候不适用Statement而是使用PreparedStatement;
使用方法:

//		3、获取执行sql语句的对象
		String sql = "select * from student where name = ?";//其中问号为占位符
		PreparedStatement preparedStatement = conn.prepareStatement(sql);
		System.out.println("请输入学生姓名:");
		Scanner scanner = new Scanner(System.in);
		String name = scanner.nextLine();
		preparedStatement.setString(1, name);//给占位符赋值,其中第一个参数为第几个占位符,第二个参数为占位符的值
		System.out.println(sql);
		ResultSet resultSet=preparedStatement.executeQuery();//执行语句
		while(resultSet.next()) {
			System.out.println("id="+resultSet.getInt(1)+" name="+resultSet.getString(2)+" age="+resultSet.getString(3)+" sex="+resultSet.getString(4));
		}
//		6、释放资源
		resultSet.close();
		preparedStatement.close();
		conn.close();

再用相同的方法测试sql注入,会发现sql注入无法成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值