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 ...
随机推荐
- Mysql执行查询语句慢的解决方式
MySQL使用的是InnoDB引擎.不同于MyISAM引擎只提供表锁,InnoDB提供不同级别的锁.但是在我们日常的操作过程中经常由于对数据库不当的SQL操作导致出现长时间的锁,造成其他的SQL语句长 ...
- Go项目实战:打造高并发日志采集系统(四)
前情回顾 前文我们完成了如下目标1 项目架构整体编写2 使框架支持热更新 本节目标 在前文的框架基础上,我们1 将之前实现的日志监控功能整合到框架中.2 一个日志对应一个监控协程,当配置热更新后根据新 ...
- mysql锁表机制分析
http://blog.csdn.net/u010942020/article/details/51925653
- Base64加密 解密
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【Linux】部署NTP时间同步服务器
1. 查看机器的Linux版本 查看集群内所有服务器的linux版本,确保相同,不要跨大版本. [root@bigdata111 ~]# cat /etc/redhat-release CentOS ...
- git合并时忽略某个文件
因为开发现场跟部署的环境不同,有很多ip地址每次都要改来改去;于是开两个分支master(用来保存部署现场的ip)和dev(开发环境的ip),开发功能时在dev分支,然后使用master合并,每个分支 ...
- 架构模式: 服务前端的后端(BFF模式)
架构模式: 服务前端的后端(BFF模式) 上下文 让我们假设您正在构建一个使用Microservice体系结构模式的在线商店,并且您正在实现产品详细信息页面.您需要开发产品详细信息用户界面的多个版本: ...
- C语言递归之二叉树的最大深度
题目描述 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例 给定二叉树 [3,9,20,null,null,15 ...
- 零零散散的shell笔记
ls __paddlepalm_* > __palminfo__ 名字以__paddlepalm_开头的文件名打印到后面那个info里面 https://www.runoob.com/linux ...
- Mac 每次重启终端后配置的不生效.需要重新source
Mac 每次都要执行source ~/.bash_profile 配置的环境变量才生效 自己在 ~/.bash_profile 中配置环境变量, 可是每次重启终端后配置的不生效.需要重新执行 : $s ...