遇见SQL注入应该如何解决

49次阅读
没有评论

共计 2627 个字符,预计需要花费 7 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍了遇见 SQL 注入应该如何解决,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。

SQL 注入是什么?

看一下百度百科的定义:
遇见 SQL 注入应该如何解决
啊,好长一大段文字,些许不想看,下面通过一个例子,来说明一下什么是 SQL 注入:

新建一个数据库,再建一个表,添加两行数据:

use db1;create table user(
 id int primary key auto_increment,
 username varchar(32),
 password varchar(32));insert into user values(null, zhangsan , 123 insert into user values(null, lisi , 234

表如下图所示:
遇见 SQL 注入应该如何解决
再随随便便用 JDBC 写个登陆操作:

package com.wzq.jdbc;import com.wzq.util.JDBCUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Scanner;/*
 *  需求: * 1、通过键盘录入用户名和密码
 * 2、判断用户是否登陆成功
 * */public class JDBCDemo05 { public static void main(String[] args) { Scanner cin = new Scanner(System.in);
 System.out.println( 请输入用户名: String username = cin.nextLine();
 System.out.println( 请输入密码: String password = cin.nextLine();
 boolean res = new JDBCDemo05().login(username, password);
 if (res) System.out.println( 登陆成功! else System.out.println( 登陆失败! }
 public boolean login(String username, String password) { if (username == null || password == null) {
 return false;
 }
 Connection conn = null;
 Statement stmt = null;
 ResultSet rs = null;
 try {
 //1、获取数据库连接
 conn = JDBCUtils.getConnection(); //JDBCUtils 工具类
 //2、定义 sql
 String sql =  select * from user where username =   + username +   and password =   + password +  
 //3、获取执行 sql 的对象
 stmt = conn.createStatement();
 //4、执行 sql
 rs = stmt.executeQuery(sql);
 return rs.next();
 } catch (SQLException e) { e.printStackTrace();
 } finally { JDBCUtils.close(rs, stmt, conn);
 }
 return false;
 }}

测试一下:
遇见 SQL 注入应该如何解决
可以看到,普通的检验没有任何问题,现在使用 SQL 注入:

账户名称随便输入,密码输入:a or a = a
遇见 SQL 注入应该如何解决
惊讶的发现,居然登陆成功了。输出一下 sql 看一下:

select * from user where username =  askjdhjksahd  and password =  a  or  a  =  a

可以看到 where 之后的条件,无论是什么结果都为真,都会输出整个表:
遇见 SQL 注入应该如何解决
所以,综上所述:在 sql 拼接时,有一些 sql 的特殊关键字参与字符串的拼接,就会造成安全性问题,这就是上面为什么能登陆成功的原因所在。

那怎么解决这个问题呢?

答:利用 PreparedStatement 对象,不使用 Statement 对象。

PreparedStatement 对象是 Statement 对象的子类,它是预编译的 sql,所以运行速度会比 Statemnet 更快。

PerpaerdStatement 使用? 作为占位符,使用 setXxx(索引, 值) 给? 赋值

所以我们替换一下 Statement,写一下代码:

 public boolean login(String username, String password) { if (username == null || password == null) { return false;
 }
 Connection conn = null;
 PreparedStatement pstmt = null;
 ResultSet rs = null;
 try { //1、获取数据库连接
 conn = JDBCUtils.getConnection(); //JDBCUtils 类
 //2、定义 sql
 String sql =  select * from user where username = ? and password = ? 
 //3、获取执行 sql 的对象
 pstmt = conn.prepareStatement(sql);
 pstmt.setString(1,username);
 pstmt.setString(2,password);
 //4、执行 sql
 rs = pstmt.executeQuery();
 return rs.next();
 } catch (SQLException e) { e.printStackTrace();
 } finally { JDBCUtils.close(rs, pstmt, conn);
 } return false;
 }

测试一下:
遇见 SQL 注入应该如何解决
成功解决!

以上就是遇见 SQL 注入应该如何解决的详细内容了,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎来丸趣 TV 行业资讯!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-16发表,共计2627字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)