statement使用方法
Statement statement = connection.createStatement(); String queryString = "select username,password from user_table where username=‘" + username + "‘ and password=‘" + password + "‘"; ResultSet resultSet = statement.executeQuery(queryString);
statement 为非预编译语句,每次执行会去数据库 生成一条语句执行。
如果 password 变量 赋值为 ‘ or ‘‘1‘=‘1’ 则 整个语句为
select username,password from user_table where username=‘zhagnsan‘ and password=‘‘ or ‘1‘=‘1‘
statement会把这个字符串传给数据库进行执行,此字符串带有注入,所以输入任何信息都会 登陆成功。
prepareStatement 使用方法
String queryString = "select username,password from user_table where username = ? " + "and password = ?"; preparedStatement = connection.prepareStatement(queryString); preparedStatement.setString(1, username); preparedStatement.setString(2, password); resultSet = preparedStatement.executeQuery();
connection.prepareStatement(queryString); 会把语句传给数据库 生成预编译语句。
然后username ,password 的值就会变成 两个问号的参数。输入 or ‘‘1‘=‘1‘的值只会当成第二个参数值,数据库里预编译的语句 不会把 or 当成 选择关系关键字,只会当成一个参数字符串,传进预编译的语句,这样预编译语句 可以防止注入。
并且预编译语句 不用每次执行都去生成一条执行语句,而是生成一次之后可以多次调用使用,而statement是每次都会将拼接的 String字符串 去数据库生成语句执行。
预编译prepareStatement是statement更有效率。
时间: 2024-10-10 16:00:22