SQL 注入式危机 及其解决办法

先看一个例子

public static void main(String[] args) {
        //查询相应学号的学生信息
        String ID="";
        Scanner input=new Scanner(System.in);
        System.out.println("请输入您的学号");
        if(input.hasNextLine()) {
            ID=input.nextLine();
        }
        String sql="select * from student where ID='"+ID+"'";
        ResultSet rs=resultSet.getResultSet(sql);
        System.out.print("学号\t");
        System.out.print("姓名\t");
        System.out.print("专业\t");
        System.out.println("总学分");
        try {
            while(rs.next()) {
                  System.out.print(rs.getString("ID")+"\t");
                  System.out.print(rs.getString("name")+"\t");
                  System.out.print(rs.getString("dept_name")+"\t");
                  System.out.println(rs.getInt("tot_cred"));
            }
        }catch(SQLException e) {
            System.err.println("查询出错!!"+e.getStackTrace());
        }
    }
  • 先看正常的输入
    这里写图片描述

  • 执行结果:
    这里写图片描述

  • 再看异常输入
    这里写图片描述

  • 执行结果:
    这里写图片描述

  • 可见,这样输入之后,可以查询到所有的学生信息,如果是银行或者国家政府结构的话,是非常危险的

  • 为什么会这样呢?
  • 我输入的是 1’ or 1=1 –
  • 这样sql语句为:select * from student where id=’1’ or 1=1 –’
  • 有效的部分:select * from student where id=’1’ or 1=1,因为–把后面的注释掉了
  • 看一下where后面的部分:id=’1’ or 1=1,是一个永真式
  • 进而sql语句等价为:select * from student
  • 多么可怕!!!

解决办法

使用占位符
public static void main(String[] args) {
        //查询相应学号的学生信息
        String ID="";
        Scanner input=new Scanner(System.in);
        System.out.println("请输入您的学号");
        if(input.hasNextLine()) {
            ID=input.nextLine();
        }
        String sql="select * from student where ID=?";
        PreparedStatement pstmt=preparedStatement.getPreparedStatement(sql);
        System.out.print("学号\t");
        System.out.print("姓名\t");
        System.out.print("专业\t");
        System.out.println("总学分");
        try {
            pstmt.setString(1, ID);
            ResultSet rs=pstmt.executeQuery();
            while(rs.next()) {
                  System.out.print(rs.getString("ID")+"\t");
                  System.out.print(rs.getString("name")+"\t");
                  System.out.print(rs.getString("dept_name")+"\t");
                  System.out.println(rs.getInt("tot_cred"));
            }
        }catch(SQLException e) {
            System.err.println("查询出错!!"+e.getStackTrace());
        }
    }
  • 正常输入:
    这里写图片描述

  • 执行结果:
    这里写图片描述

  • 异常输入:
    这里写图片描述

  • 执行结果:
    这里写图片描述

问题已解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值