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

知识点:展示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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值