public static boolean fun3(String username,String password) throws ClassNotFoundException, SQLException{
String driverClassName="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/mydb";
String user="root";
String pas="123";
Class.forName(driverClassName);
Connection con=DriverManager.getConnection(url, user, pas);
Statement st=con.createStatement();
String sql="SELECT *FROM t_user WHERE username='"+username+"'AND password='"+password+"'";
ResultSet rs=st.executeQuery(sql);
return rs.next();
}
public static void main(String [] args) throws ClassNotFoundException, SQLException{
String username="wangwu";
String password="111y";
System.out.println(fun3(username,password));
}
但是存在sql注入:
当输入
String username="a' or 'a'='a";
String password="a' or 'a'='a";
实际上发送给数据库的sql语句是:
SELECT *FROM t_user WHERE username='a' or 'a'='a'AND password='a' or 'a'='a'
返回的始终是true。
防止sql注入的方法之一:PreparedStatement
PreparedStatement的特点:
防止SQL注入,提高代码的可读性和可维护性,提高效率
改成以下方式,就不存在SQL注入了
/*一、使用PreparedStatement
* 1.给出sql语句,所有参数用?代替
* 2.调用Connection的方法,得到PreparedStatement
*/
String sql="SELECT * FROM t_user WHERE username=? AND password=?";
PreparedStatement pps=con.prepareStatement(sql);
/*
* 二、为参数赋值
*/
pps.setString(1, username);//为第一个?赋值
pps.setString(2, password);
ResultSet rs=pps.executeQuery();
return rs.next();