验证用户登录时用户名和密码是否正确及如何防止sql注入

论坛 期权论坛 脚本     
匿名技术用户   2020-12-23 13:34   11   0
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();



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP