代码模拟SQL注入问题及解决方法

本文分析了如何通过PreparedStatement避免SQL注入漏洞,比较了Statement和PreparedStatement在执行SQL时的安全性,并给出了实际代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Test
    public void method2() throws Exception {
        String url = "jdbc:mysql:///db1";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        String name = "asfdf";
        String pwd = "' or '1' = '1";
        String sql = "select * from calss where username = '"+name+"'  and password = '"+pwd+"'";
        
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        
        if (rs.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
        
        rs.close();
        stmt.close();
        conn.close();
    }

此代码中,条件 username = 'sjdljfld' and password = '' 不管是否满足,而 or 后面的 '1' = '1' 是始终满足的,最终条件是成立的,就可以正常的进行登陆了。

@Test
    public void method2() throws Exception {
        String url = "jdbc:mysql:///db1";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        String name = "asfdf";
        String pwd = "' or '1' = '1";
        String sql = "select * from calss where username = ?  and password = ?";

        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setObject(1,name);
        pstmt.setObject(2,pwd);
        ResultSet rs = pstmt.executeQuery();

        if (rs.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }

        rs.close();
        pstmt.close();
        conn.close();
    }

此代码使用PreparedStatement代替Statement执行上面的语句就不会出现SQL注入漏洞问题,他是对所输入的字符进行了转义,在一些特殊符号前面加了转义字符,是他们不能和SQL语句连接起来,以修改本来的语义。如下:

select * from tb_user where username = 'sjdljfld' and password = '\'or \'1\' = \'1'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值