实现模拟登陆效果:基于表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语句防注入问题的更多相关文章

  1. mybatis 的sql语句及使用mybatis的动态sql mybatis防注入

    由于看到写的比较详细的文档这里将之前的删掉了,只留下一些我认为能帮助理解的和关于动态sql及防注入的一些理解.文档链接  :mybatis官方文档介绍 <!-- 根据条件查询用户 --> ...

  2. JDBC编程之预编译SQL与防注入

    在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedS ...

  3. 【JDBC】预编译SQL与防注入式攻击

    在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedS ...

  4. Statement 接口的应用(存在sql语句的注入风险)

    实现简单的登录功能 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impo ...

  5. 使用 JDBC 和 JavaTemplate 查询SQL语句返回 List<Map<String,Object>>

    使用JDBC执行sql语句返回List 类型: public class JdbcUtil { private static Log log = LogFactory.getLog(JdbcUtil. ...

  6. JDBC与Hibernate中SQL语句参数设置的顺序问题

    JDBC中:设置从1开始 例: Connection con = DriverManager.getConnection("jdbc:mysql://localhost/...", ...

  7. sql server 防 注入

    这里使用的是参数化 SqlParameter useremail = new SqlParameter("@useremail", user.user_Email); SqlPar ...

  8. (非原)SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。

    原地址:blog.csdn.net/lvjin110/article/details/28697695 like 语句拼sql 如何防止注入攻击?http://bbs.csdn.net/topics/ ...

  9. SQL防注入程序 v1.0

    /// ***************C#版SQL防注入程序 v1.0************ /// *使用方法: /// 一.整站防注入(推荐) /// 在Global.asax.cs中查找App ...

随机推荐

  1. Redis 集群部署

    一.下载所需软件包 redis wget http://download.redis.io/releases/redis-4.0.6.tar.gz ruby wget https://cache.ru ...

  2. delphi 中Adoquery ,在打开时能否让记录指针不移动? [问题点数:40分,结帖人microd]

    delphi 中Adoquery ,在打开时能否让记录指针不移动?由于数据集Adoquery 时,它的针指称动会废时,能否在打开完成之前不让记录指针不移动.打开完毕之后再回复移动? 这样用:self. ...

  3. php支持多个地址跨域访问

    //跨域访问的时候才会存在此字段 $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : ''; $allow_ori ...

  4. Java内部类(1):概述

    > 将一个类的定义放在另一个类的定义内部,这就是内部类. > 使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内 ...

  5. jackson对Exception类型对象的序列化与反序列化

    发现问题 今天在调试系统错误通知的时候遇到了一个问题.我们在系统异常时候要通过队列系统发送各种通知到团队内部成员. 因此我写了一个通用接口.接口中有传递Exception对象到队列中,再由队列消费者解 ...

  6. 前端web worker实践与总结

    参考链接:https://www.jianshu.com/p/97f6144dfddf

  7. 二分图的最大匹配以及带权匹配【匈牙利算法+KM算法】

    二分图算法包括 匈牙利算法 与 KM算法. 匈牙利算法 在这里写上模板. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 #include< ...

  8. ubuntu linux环境下安装配置jdk和tomcat

    关于linux搭建服务器,ubuntu中jdk和tomcat的安装和配置 一.jdk的安装配置 1:去官网下载好自己需要的版本,注意,linux压缩文件通常以tar.gz结尾,别下载错了.本次我下载安 ...

  9. 线性基求交(2019牛客国庆集训派对day4)

    题意:https://ac.nowcoder.com/acm/contest/1109/C 问你有几个x满足A,B集合都能XOR出x. 思路: 就是线性基求交后,有几个基就是2^几次方. #defin ...

  10. drf-更新四大接口-单改整体-单改局部-群改整体-群改局部-04

    目录 复习 基于前一天序列化基础 整体单改 单与整体局部修改 复习 """ 1.ModelSerializer序列化类 models.py class BaseModel ...