关闭

如何解决java.sql.Statement无法处理特殊字符以及容易被黑问题

标签: 数据sql
207人阅读 评论(0) 收藏 举报
分类:

知识点:展示java.sql.Statement 有两个缺陷,解决方法

第一个:展示Statement的缺陷1(测试数据:1003 换行 a’s) –即若用户输入sql中的特殊字符则程序会挂)

public void dem04() throws Exception{
        Connection con = ConnUtils.getConnection();
        Statement st = con.createStatement();
        // 假设书名含有特殊符号 '  Statement将无法处理~ 
        String name = "a's";
        String sql_insert = "insert into book(name,price,birth) values('"+name+"','105.3','1883-5-6 13:11:11');";
        System.out.println(sql_insert);
        int n = st.executeUpdate(sql_insert);
        con.close();
    }

结果失败 含有特殊符号的书名添加失败~
这里写图片描述
我们输入的SQL语句
这里写图片描述

第二个:展示Statement的缺陷2(测试数据:aa’ or ‘1’=’1) –即若用户输入sql中的特殊字符则程序会黑进)

public void dem05() throws Exception{
        Connection con = ConnUtils.getConnection();
        Statement st = con.createStatement();
        // 假设书名含有特殊符号 '  Statement将无法处理~ 
        String name = "aa' or '1'='1";
        String sql = "select count(*) from stud where sname='"+name+"'";
        System.out.println("实际的SQL语句:"+sql);
        ResultSet rs = st.executeQuery(sql);
        rs.next();
        int a = rs.getInt(1);
        if(a==0){
            System.out.println("登陆失败!!");
        }else{
            System.out.println("登录成功!!");
        }
        con.close();
    }

结果 数据库不存在的用户登录进去了。
这里写图片描述

如何解决? 用java.sql.PreparedStatement;
使用方法如下

// 当用户数入的参数时,一定要通过预处理(PreparedStatement)防黑和防止特殊字符
    @Test
    public void demo6() throws Exception{
        Connection con = ConnUtils.getConnection();
//      String sql_insert = "insert into book(name,price,birth) values('"+name+"','105.3','1883-5-6 13:11:11');";
        String sql = "insert into book(name,price,birth) values(?,?,?);";
        PreparedStatement pst = con.prepareStatement(sql);
        //含有特殊字符的书名
        String name = "a's";
        String price = "37.5";
        String birth = "1783-5-6 13:31:11";
        //设置三个? (参数)
        pst.setString(1, name);
        pst.setString(2, price);
        pst.setString(3, birth);
        // 执行的时候不需要再给参数。
        pst.execute();
        con.close();
    }

数据库内部添加特殊字符书名成功
这里写图片描述

防黑缺陷解决

@Test //同时展示Statement的缺陷2(测试数据:aa' or '1'='1) --即若用户输入sql中的特殊字符则程序会黑进)
    public void demo7() throws Exception{
        Connection con = ConnUtils.getConnection();
        String sql = "select count(*) from stud where sname=?";
//      Statement st = con.createStatement();
        PreparedStatement pst = con.prepareStatement(sql);
        // 假设书名含有特殊符号 '  Statement将无法处理~ 
        String name = "aa' or '1'='1";
        pst.setString(1, name);
        //执行时不要再给参数了,否则就调用调用 statement的方法了
        ResultSet rs = pst.executeQuery();
        rs.next();
        int a = rs.getInt(1);
        if(a==0){
            System.out.println("登陆失败!!");
        }else{
            System.out.println("登录成功!!");
        }
        con.close();
    }

这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:43450次
    • 积分:3096
    • 等级:
    • 排名:第11847名
    • 原创:275篇
    • 转载:2篇
    • 译文:0篇
    • 评论:20条
    最新评论