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

什么是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()方法传值.

你可能感兴趣的:(原创,Java,MySQL数据库,黑客攻击数据库手段SQL注入,预防SQL注入的方法)