数据库如下:
首先编写一个资源文件jdbc.properties内容如下
username:root
password:4321
driver:com.mysql.cj.jdbc.Driver
url:jdbc:mysql://localhost:3306/demo1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone =GMT
下面上主菜
public static void main(String[] args) throws Exception {
//读取jdbc.properties 文件中的有关数据库的信息
Properties properties = new Properties();
properties.load(day_02.class.getClassLoader().getResourceAsStream("jdbc/jdbc.properties"));//这里路径填自己文件的相对路径即可
//加载mysql驱动
Class.forName(properties.getProperty("driver"));
//创建连接,获取Connection对象
Connection connection = DriverManager.getConnection(properties.getProperty("url"), properties.getProperty("username"), properties.getProperty("password"));
//创建一个statement对象
Statement statement = connection.createStatement();
//编写sql语句并执行
ResultSet resultSet = statement.executeQuery("select * from admin ");
//利用resultset中的光标将结果输出,ResultSet光标最初位于第一行之前; 第一次调用方法next使第一行成为当前行; 第二个调用使第二行成为当前行,依此类推。
while (resultSet.next()) {
//获取第一列数据
System.out.println(resultSet.getString(1));
//获取第二列数据
System.out.println(resultSet.getInt(2));
//获取第三列数据
System.out.println(resultSet.getDate(3));
}
resultSet.close();
statement.close();
connection.close();
}
这便是传统的jdbc连接数据库进行数据访问
现在做如下更改将
ResultSet resultSet = statement.executeQuery("select * from admin ");
修改为
ResultSet resultSet1 = statement.executeQuery("select * from admin where admin_number='admin' #admin_password=123");
或者修改为
ResultSet resultSet2 = statement.executeQuery("select * from admin where admin_number='admin' and admin_password=12346 or 1=1");
这样都可以在数据库查询出一样的结果,这便是sql注入,这样就可以实现,当用户在登陆的时候无需输入密码便可以登陆成功!
防止sql注入使用的是PreparedStatement预编译语句集,它内置了处理SQL注入的能力。
原理:
sql注入只对sql语句的准备(编译)过程有破坏作用
而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,
而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.
代码如下
//对sql语句经行预编译
PreparedStatement preparedStatement = connection.prepareStatement("select * from admin where admin_number=? and admin_password=?");
preparedStatement.setString(1,"admin");
preparedStatement.setInt(2,123456789);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
System.out.println(resultSet.getString(1));
System.out.println(resultSet.getInt(2));
System.out.println(resultSet.getDate(3));
}