Java JDBC 使用Statement 产生sql注入问题

#Java JDBC 使用Statement 产生sql注入问题

  • Statement 对象用于执行静态SQL语句并返回其生成的结果对象

Statement 对象执行SQL语句,存在SQL注入风险

代码演示:

  1. 先创建一张表
-- 演示 sql 注入 
-- 创建一张表 
CREATE TABLE admin ( -- 管理员表 
NAME VARCHAR(32) NOT NULL UNIQUE, 
pwd VARCHAR(32) NOT NULL DEFAULT '') 
CHARACTER SET utf8;
-- 添加账号数据 
INSERT INTO admin VALUES('jack', '12345'); 

在这里插入图片描述

  1. 演示 statement 的注入问题
public class StatementDemo {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in); //让用户输入管理员名和密码
        System.out.print("请输入账号: ");
        // next(): 当接收到 空格或者 '就是表示结束 这里用nextLine()
        String admin_name = scanner.nextLine();
        System.out.print("请输入密码: ");
        String admin_pwd = scanner.nextLine();
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
		//获取相关的值
        String user = "root";
        String password = "root";
        String url = "jdbc:mysql://localhost:3306/db01";
        String driver = "com.mysql.jdbc.Driver";
        //1.建立连接
        Class.forName(driver);
        //2.得到链接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3.得到statement
        Statement statement = connection.createStatement();
        //4.编写sql 
        //这里故意
        //-- 输入用户名 为 1' or
		//-- 输入万能密码 为 or '1'= '1 
        String sql = "select name , pwd from admin where name  = '"
                + admin_name + "'and pwd = '" + admin_pwd + "'";
        //执行给定的 SQL 语句,该语句返回单个 ResultSet 对象
        ResultSet resultSet = statement.executeQuery(sql);
        //5.使用while获取数据
        if (resultSet.next()) { //如果查询到一条记录,则说明该管理存
            System.out.println("恭喜, 登录成功");
        } else{
            System.out.println("对不起,登录失败");

        }
        //6.关闭连接
        statement.close();
        connection.close();
        resultSet.close();

    }
}

在这里插入图片描述

代码中的sql就相当于将本来的SELECT语句给改写了,将WHERE后面的条件永远成立

相当于: name = ‘1’ 或者= ‘AND pwd’ 或者 ‘1’=‘1’;

可以看出不管怎样最后一个1=1必然成立,所以这个语句就会执行成功

  • SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库。
  • 要防范SQL注入,只要用 PreparedStatement(从Statement扩展而来)取代Statement 就可以了。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别来无恙blwy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值