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注入无法成功。