使用Statement类执行SQL语句时存在SQL注入漏洞(黑客攻击数据库常用手段),及预防注入的方法(PrepareStatement类)

32 篇文章 0 订阅
16 篇文章 0 订阅

什么是SQL注入

SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,它目前是黑客对数据库进行攻击的最常用手段之一。

SQL注入实例

绕过登录(只需知道用户名、无需知道密码即可登录成功)
实际userName=“zs”;password=“123”;

//模拟用户输入userName和password
String userName = "zs";
String password = "123";
String sql = "select * from user where username = '"+userName+" " +
                    "and password = '"+password+"' ";

黑客使用的方法

1. 使用–将password那部分的语句注释掉

String userName = "zs' --";
 String password = "fdfdfdfdf";
String sql = "select * from user where username = '"+userName+" " +
                    "and password = '"+password+"' ";

2. 使用or

String userName = "zs'  or 1=1";
            String password = "fdfdfdfdf";
            String sql = "select * from user where username = '"+userName+" " +
                    "and password = '"+password+"' ";

对应实际的SQL语句:

select * from user where username='zs' or 1=1 and password='dfdfdfdfdf';

用or将语句分为两部分: select * from user where username='zs'1=1 and password='dfdfdfdfdf';

预防SQL注入的方法

使用PrepareStatement类:预编译SQL,开发时常用这个类。

            String sql = "select * from user" +
                    " where username = ? and password = ?";//?占位符
            // 预编译SQL
            PreparedStatement statement =
                    connection.prepareStatement(sql);
            String userName = "zs or 1=1";
            String password = "dfdfdfdfd";
            statement.setString(1,userName);//传值给第一个占位符
            statement.setString(2,password);
            ResultSet resultSet = statement.executeQuery();

使用PrepareStatement的setXXX()方法传值.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值