遇见SQL注入应该如何解决
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍了遇见SQL注入应该如何解决,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。SQL注入是什么?看一下百度百科的定义:啊,好长一大段文字,些许不想看,下面通过一个例子,
千家信息网最后更新 2025年11月07日遇见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安全错误
数据库的锁怎样保障安全
华为跟腾讯哪家网络技术厉害
服务器最强实战技巧
签名代码软件开发
android当服务器吗
清除服务器日志
网络安全开发面试题
手机媒体服务器
数据库指定删除
数据库多库连接查询
udp 数据库
sql2005 数据库
通信传输线路网络安全保障措施
金山区综合网络技术代理商
网络安全与软件开发谁更简单
多个服务器管理工具
武汉阿拉丁网络技术
数据库查询软件最新正式版
中国移动网络安全等级
数据库与数据库系统
宁陕县服务器
华为跟腾讯哪家网络技术厉害
X86服务器远程管理口IP地址
电子网络技术学的是什么意思
数据库中关系图的交并差
计算机网络技术是什么的含义
企业网络安全与防护论文
党政信息网络安全技术
深圳期贷科技互联网有限公司
db2数据库文件格式
h3c服务器远程管理密码