如何防止SQL注入
目录
SQL注入
1、 什么是SQL注入
select * from tb_user where username = '111' and password = '111'
select * from tb_user where username = '111' and password = '111' or '1=1'
用户输入的数据中有
SQL关键词
,导致在执行SQL语句时出现一些不正常的情况.这就是SQL注入!
出现SQL注入是很危险
2、 避免SQL注入
问题出现在用户输入数据时,里面有
关键词
,再配合字符串拼接导致
出现SQL注入.所以为了避免SQL注入,可以在用户输入数据到SQL之前,先把SQL语句预编译
,预处理后,JDBC就会知道此SQL需要几个参数,后续再将用户输入的数据给参数填充.这就是PreparedStatement
PreparedStatement【重点】
PreparedStatement是Statement的子接口,用来预处理SQL语句
PreparedStatement使用
先写SQL语句,SQL语句中的参数不能直接拼接,而是使用
?占位
使用ps预处理SQL语句,处理的?号,ps内部就会知道此SQL语句需要几个参数
再动态给?处填充值
执行sql
public class Demo3 {
public static void main(String[] args) throws Exception {
// 1加载驱动
// 2获得连接
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2311?useSSL=false", "root", "123456");
// 3获得[预处理语句]对象
/**
* 使用预处理对象有步骤
* 1 先写sql,语句中需要拼接参数的地方用?占位
* 2 通过连接对象,调用处理语句的方法,传入sql参数,对语句处理后
* 获得一个含有处理过sql的语句对象
* 3 给处理过的?处赋值
* 4 执行
*/
String sql = "select * from tb_user where username = ? and password = ?";
System.out.println("处理前:" + sql );
PreparedStatement ps = conn.prepareStatement(sql);
System.out.println("处理后:" + ps );
// 3 给?赋值
ps.setString(1,"uzi");
ps.setString(2,"123456");
System.out.println("赋值后:" + ps );
// 4执行sql语句
ResultSet rs = ps.executeQuery( );// 【特别注意: 不需要再传参数】
while(rs.next()) {
User user = new User( );
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setPhone(rs.getString("phone"));
user.setCreateTime(rs.getDate("create_time"));
user.setMoney(rs.getDouble("money"));
user.setSex(rs.getInt("sex"));
System.out.println(user );
}
// 5关流
rs.close();
ps.close();
conn.close();
}
}
使用预处理语句改造登录案例
public class Demo4_login_plus {
public static void main(String[] args) {
input();
}
// 设计方法完成输入
public static void input() {
System.out.println("欢迎登录LPL选手管理系统" );
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:" );
String username = scanner.nextLine( );
System.out.println("请输入密码:" );
String password = scanner.nextLine( );
User user = login(username, password);
if (user != null) {
System.out.println("欢迎进入系统:" + user );
} else {
System.out.println("用户名或密码错误!" );
}
}
public static User login(String username,String password){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
User user = null; // 初始值
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2311?useSSL=false", "root", "123456");
// 1 先写sql,条件写?
String sql = "select * from tb_user where username = ? and password = ?";
// 2 获得预处理语句对象
ps = conn.prepareStatement(sql);
// 3 给?赋值
ps.setString(1,username);
ps.setString(2,password);
System.out.println(ps );
// 4 执行
rs = ps.executeQuery( );
while (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setPhone(rs.getString("phone"));
user.setCreateTime(rs.getDate("create_time"));
user.setMoney(rs.getDouble("money"));
user.setSex(rs.getInt("sex"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
ps.close();
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
return user;
}
}
原文地址:https://blog.csdn.net/weixin_61898502/article/details/142438719
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!