防止sql注入问题 (模拟登陆)

package com.itheima.jdbc;

import sun.font.DelegatingShape;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
* 解决mysql注入问题
*/
public class JDBCdeom2 {
public static void main(String[] args) throws Exception{
Statement stmt = null;
Connection conn = null;


// 1.注册驱动,会抛出ClassNotFoundException异常(MySQL5.0后可省略)
Class.forName("com.mysql.jdbc.Driver");
// 2.获取Connection对象,会抛出SQLException异常(因为连接的是本机的数据库所以ip地址和端口号可以省略不写)
conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db1","root","1234");
// 登录的用户名和密码
String name="zhangsan";
String passwd="' or '1'='1";
// 3.定义SQL
String sql="select * from user1 where name=? and passwd=?";
// 4.获取执行SQL的对象Staement

PreparedStatement pstmt= conn.prepareStatement(sql);
// stmt = conn.createStatement();
// 5.执行SQL(返回一个结果)
//设置?的值
pstmt.setString(1,name);
pstmt.setString(2,passwd);
//执行sql 返回一个结果集
ResultSet re= pstmt.executeQuery();

//建立集合
List<User> list=new ArrayList<User>();
//遍历数据
if(re.next()){
System.out.println("登录成功");
}
else System.out.println("登录失败");

while(re.next()){
int id=re.getInt("id");
String name1= re.getString("name");
int money= re.getInt("money");
User u=new User();
u.setId(id);
u.setName(name1);
u.setMoney(money);
list.add(u);
}

//遍历集合
for ( User i: list) {
System.out.println(i.getId()+i.getName()+i.getMoney());
System.out.println("-------");
}
// 7.释放资源(如果第5步执行报错就不会执行下面的语句,下面的代码就不会正常执行)
pstmt.close();
conn.close();

//
}
}






这是设置了防注入的 当密码正确时 我可以登陆,当密码错误时 不可以登陆

 

 

 

 

 

 

 

下面是没设置防注入的

 

 

 

 

可以看见将密码通过字符串拼接是可以进去系统的

 下面是数据库数据

 

 

posted @ 2022-04-02 11:30  java小寇  阅读(184)  评论(0)    收藏  举报