sql注入

数据库如下:
在这里插入图片描述

首先编写一个资源文件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));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值