解决 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;
}
测试一下:
成功解决!
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanfgiib
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01