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());
        }
    }
  • 正常输入:
    这里写图片描述

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

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

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

问题已解决

阅读更多
文章标签: SQL 注入式危机
个人分类: SQL
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭