JDBC模拟登陆及SQL语句防注入问题
实现模拟登陆效果:基于表Tencent
package boom; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Scanner; /**
* 模拟登陆
*
* @author Administrator
*
*/
public class JdbcLogin {
public static void main(String[] args) {
// 接收控制台信息
Scanner scanner = new Scanner(System.in);
// 提示语句
System.out.println("请输入用户名:");
String name = scanner.next();
System.out.println("请输入密码:");
String pwd = scanner.next(); // 声明参数
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String userName = "scott";
String userPwd = "tiger"; // 声明连接,初始化为空
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null; try {
// 1.加载驱动
Class.forName(driver);
// 2.创建连接
connection = DriverManager.getConnection(url, userName, userPwd);
// 3.创建SQL命令发送器
statement = connection.createStatement();
// 4.发送SQL获取结果
// 查询表里的对应数据源
String sql = "select * from Tencent where uname = '"+name+"' and upwd = '"+pwd+"' ";
System.out.println("HelloJdbcLogin.main(sql):"+sql);
resultSet = statement.executeQuery(sql);
//5:处理结果--判断是否有这个用户
if(resultSet.next()){
System.out.println("HelloJdbcLogin.main(登陆成功)");
}else{
System.out.println("HelloJdbcLogin.main(登陆失败)");
} } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6.关闭资源 【先开后关】
try {
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
效果:
--请输入用户名:
迪丽热巴
--请输入密码:
1213456
--HelloJdbcLogin.main(sql):select * from Tencent where uname = '迪丽热巴' and upwd = '1213456'
HelloJdbcLogin.main(登陆成功)
----------------------------------------------------------------------------------------------
--请输入用户名:
迪丽热巴
--请输入密码:
12346
--HelloJdbcLogin.main(sql):select * from Tencent where uname = '迪丽热巴' and upwd = '12346'
HelloJdbcLogin.main(登陆失败)
执行代码用SQL注入拼接实现【SQL注入成功】
--请输入用户名:
小喜庆
--请输入密码:
664654'or'1'='1
--HelloJdbcLogin.main(sql):select * from Tencent where uname = '小喜庆' and upwd = '664654'or'1'='1'
HelloJdbcLogin.main(登陆成功)
为什么会注入成功?
Statement:不安全,拼接麻烦,阅读性差
PreparedStatement:安全,阅读性好,(执行效率高)
防止SQL注入风险:PreparedStatement
// 声明连接,初始化为空
Connection connection = null;
// 修改Statement ==> PreparedStatement
PreparedStatement ps = null;
ResultSet resultSet = null; try {
// 加载驱动
Class.forName(driver);
// 创建连接
connection = DriverManager.getConnection(url, userName, userPwd);
// 创建SQL命令发送器
// ? 相当于占位符
String sql = "select * from Tencent where uname = ? and upwd =?";
ps=connection.prepareStatement(sql);
// 赋值占位
ps.setString(1, name);
ps.setString(2, pwd);
// 4.发送SQL获取结果
System.out.println("HelloJdbcLogin.main(sql):"+sql);
resultSet = ps.executeQuery();
//5:处理结果--判断是否有这个用户
if(resultSet.next()) {
System.out.println("HelloJdbcLogin.main(登陆成功)");
} else {
System.out.println("HelloJdbcLogin.main(登陆失败)");
}
详细代码:
package boom; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner; public class JdbcLogin2 {
public static void main(String[] args) {
// 接收控制台信息
Scanner scanner = new Scanner(System.in);
// 提示语句
System.out.println("请输入用户名:");
String name = scanner.next();
System.out.println("请输入密码:");
String pwd = scanner.next(); // 声明参数
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String userName = "scott";
String userPwd = "tiger"; // 声明连接,初始化为空
Connection connection = null;
PreparedStatement ps = null;
ResultSet resultSet = null; try {
// 1.加载驱动
Class.forName(driver);
// 2.创建连接
connection = DriverManager.getConnection(url, userName, userPwd);
// 3.创建SQL命令发送器
//?相当于占位符
String sql = "select * from Tencent where uname = ? and upwd =?";
ps=connection.prepareStatement(sql);
// 赋值
ps.setString(1, name);
ps.setString(2, pwd);
// 4.发送SQL获取结果
System.out.println("HelloJdbcLogin.main(sql):"+sql);
resultSet = ps.executeQuery();
//5:处理结果--判断是否有这个用户
if(resultSet.next()){
System.out.println("HelloJdbcLogin.main(登陆成功)");
}else{
System.out.println("HelloJdbcLogin.main(登陆失败)");
} } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6.关闭资源 【先开后关】
try {
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
【SQL注入失败】
--请输入用户名:
小喜庆
--请输入密码:
664654'or'1'='1
--HelloJdbcLogin.main(sql):select * from Tencent where uname = ? and upwd =?
HelloJdbcLogin.main(登陆失败)
JDBC模拟登陆及SQL语句防注入问题的更多相关文章
- mybatis 的sql语句及使用mybatis的动态sql mybatis防注入
由于看到写的比较详细的文档这里将之前的删掉了,只留下一些我认为能帮助理解的和关于动态sql及防注入的一些理解.文档链接 :mybatis官方文档介绍 <!-- 根据条件查询用户 --> ...
- JDBC编程之预编译SQL与防注入
在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedS ...
- 【JDBC】预编译SQL与防注入式攻击
在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedS ...
- Statement 接口的应用(存在sql语句的注入风险)
实现简单的登录功能 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impo ...
- 使用 JDBC 和 JavaTemplate 查询SQL语句返回 List<Map<String,Object>>
使用JDBC执行sql语句返回List 类型: public class JdbcUtil { private static Log log = LogFactory.getLog(JdbcUtil. ...
- JDBC与Hibernate中SQL语句参数设置的顺序问题
JDBC中:设置从1开始 例: Connection con = DriverManager.getConnection("jdbc:mysql://localhost/...", ...
- sql server 防 注入
这里使用的是参数化 SqlParameter useremail = new SqlParameter("@useremail", user.user_Email); SqlPar ...
- (非原)SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。
原地址:blog.csdn.net/lvjin110/article/details/28697695 like 语句拼sql 如何防止注入攻击?http://bbs.csdn.net/topics/ ...
- SQL防注入程序 v1.0
/// ***************C#版SQL防注入程序 v1.0************ /// *使用方法: /// 一.整站防注入(推荐) /// 在Global.asax.cs中查找App ...
随机推荐
- 4. Linux管理命令
df.du:磁盘.空间相关的命令 df -h 以直观的方式显示磁盘分区使用状况 df test 查询test属于哪个分区 du du -h 以直观方式显示文件夹目录的使用状况 du -s 只显示当 ...
- Leetcode之动态规划(DP)专题-714. 买卖股票的最佳时机含手续费(Best Time to Buy and Sell Stock with Transaction Fee)
Leetcode之动态规划(DP)专题-714. 买卖股票的最佳时机含手续费(Best Time to Buy and Sell Stock with Transaction Fee) 股票问题: 1 ...
- VS2019 安装并破解 DevExpress 19.2 插件
0.写在最前 本人vs版本为: 1.下载DevExpress 最新版本插件程序 官网下载试用30天地址: https://www.devexpress.com/products/net/con ...
- RestTemplateBuilder类
Spring Boot使用RestTemplate消费REST服务的几个问题记录 我们可以通过Spring Boot快速开发REST接口,同时也可能需要在实现接口的过程中,通过Spring Boot调 ...
- linux文件权限更改命令chmod及数字权限实践总结
改变权限属性命令chmod chmod 是用来改变文件或目录权限的命令,但只有文件的属主和超级用户root才有这种权限.通过chmod来改变文件或目录的权限有两种方法:一种是通过权限字母和操作符表达 ...
- delphicbuilder10_2_1 安装破解注册
安装程序 1.解压delphicbuilder10_2_1.iso,以管理员身份运行..\delphicbuilder10_2_1\Install\Setup.exe——选择安装语言——点击OK(推荐 ...
- Web循环监控Java调用 / Java调用.net wcf接口
背景介紹 (Background Introduction) 目前有一些报表客户抱怨打不开 报表执行过程过长,5.8.10秒甚至更多 不能及时发现和掌握服务器web站点情况 用戶需求(User Req ...
- spring-boot 连接数据库(六)
环境 jdk 6 tomcat 6.0.53 sts 4.4.2 maven 3.2.5 mysql 5.7 准备 接下来的数据库操作基于 mysql,所以需要一套可用的 mysql 环境. 引入 j ...
- 【NOIP2015普及组】 推销员(纪中数据-标准)
题目 [题目描述] 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 i 家住户到入口的距离为 ...
- python---博客分类目录
python基础 python函数 python模块 python面向对象 网络编程 并发编程 数据库 前端学习 HTML基础 CSS基础 JavaScript基础 js操作BOM和DOM jQuer ...