遇见SQL注入应该如何解决
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了遇见SQL注入应该如何解决,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。SQL注入是什么?看一下百度百科的定义:啊,好长一大段文字,些许不想看,下面通过一个例子,
千家信息网最后更新 2026年10月31日遇见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');
表如下图所示:
再随随便便用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注入:
账户名称随便输入,密码输入:a' or 'a'='a
惊讶的发现,居然登陆成功了。输出一下sql看一下:
select * from user where username = 'askjdhjksahd' and password = 'a' or 'a' = 'a'
可以看到where之后的条件,无论是什么结果都为真,都会输出整个表:
所以,综上所述:在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注入应该如何解决的详细内容了,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎来行业资讯!
对象
成功
登陆
数据
输入
密码
数据库
用户
问题
内容
就是
用户名
测试
输出
普通
特殊
代码
价值
例子
关键
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技工作委员会
为想互联网科技
互联网与新科技
北京互联网络科技有限公司
互联网金融科技创新
友谊互联网络科技
深圳艾佳互联网科技
广州慧亚互联网科技怎么样
昭通云南众福互联网科技有限公司
想开互联网科技公司怎么样
996高科技互联网公司
浙南科技城互联网大厦建设工程
互联网在线教育科技创业
互联网科技资金流入
美国互联网科技公司
互联网安防科技感
风投北京互联网科技
互联网科技包装股份有限公司上市
银川新华互联网科技学校原画
中国主要互联网科技公司
上海睿民互联网科技有限公司
科技互联网龙头
迪茉互联网科技
互联网金融科技委员会
天扬科技互联网广告
互联网科技生活的内容
上海电发互联网科技有限公司
广州恒生互联网科技有限
未来五年的互联网科技
长沙茂晟互联网科技有限公司