Statement和PreparedStatement的区别

SQL注入

在了解这两个关键字的用法之前我们还是要了解SQL注入

什么是SQL注入?

通过一个例子来说:假如我们的一个登录系统,在我们数据库中有一个账户号为:tao,账户密码为:123456。

我们登录系统的时候我们只知道账户号为tao,不知道密码的情况下怎么使用SQL注入的方式登录进去呢?

在我们的登录界面的账户栏输入我们的账户:tao   

在密码的输入框中输入一段恒成立的字符串:如:‘1’ or '1'='1';

就这个直接登录进我们的一个系统

前提条件:我们的后台的代码判断账户号和密码密码是通过数据库判断的,而不是通过用户名在数据库中查出密码在JAVA代码中和输入的密码进行比较。

String str = "select * from a_account where username = %s and password = %s";

Statement连接数据库的写法:
        Class.forName("oracle.jdbc.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "tao","root");

//以前SQL的写法
/*
Statement statement = connection.createStatement();
//%s:转义符表示字符串格式
//不建议后面跟 and password='':这样的话就是纯数据库操作了,用的不好的话可能会被别人攻击,一般我们通过数据库把用户查出来后用java代码去比较,因为用户名的密码我们以后肯定是要加密的
String str = "select * from a_account where username = '%s'";
String sql = String.format(str, inputUsername);//传值,将inputUsername传给sql语句str中的%s;
       ResultSet resultSet = statement.executeQuery(sql);
PreparedStatement连接数据库的写法:
将原来表示字符串的%s用?替换了
       Class.forName("oracle.jdbc.OracleDriver");
       Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "tao","root");
       String str = "select * from a_account where username = ? and password = ?";
       PreparedStatement preparedStatement=connection.prepareStatement(str);
       preparedStatement.setString(1,inputUsername);
       preparedStatement.setString(2,inputpassword);
       ResultSet resultSet=preparedStatement.executeQuery();
PreparedStatement继承了Statement,用于防止SQL的注入,接受一个或多个动态输入参数
posted @ 2021-12-12 22:59  滔滔是个java小白  阅读(51)  评论(0编辑  收藏  举报