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更有效率。
本文介绍了如何使用PreparedStatement来预防SQL注入攻击,对比了Statement与PreparedStatement的不同之处,并解释了预编译语句如何提升效率及安全性。
869

被折叠的 条评论
为什么被折叠?



