实现模拟登陆效果:基于表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. [转]Java Jacob操作Excel

    Jacob项目:https://sourceforge.net/projects/jacob-project/ 转自:https://blog.csdn.net/ZY_extreme/article/ ...

  2. 【转载】execute、executeUpdate、executeQuery三者的区别(及返回值)

    1. ResultSet executeQuery(String sql); 执行SQL查询,并返回ResultSet 对象. 2.int executeUpdate(String sql); 可执行 ...

  3. centos7.2 apollo1.7.1的搭建

    1.准备工作 第一步:linux系统中配置好java环境安装参考地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-down ...

  4. NetCore 对Json文件的读写操作

    nuget Microsoft.Extensions.Configuration; Microsoft.Extensions.Configuration.Json; Newtonsoft.Json; ...

  5. curl and wget

    写在前面: a.  对比curl 和 wget 的相同和不同点 来记忆 a-1 curl url  直接将请求内容输出到标准输出. 如果下载不是瞬时间完成,会显示下载进度条,如果向取消,加-s : w ...

  6. MySQL连接处理方式及最佳并发连接数设置

    MySQL连接处理方式及最佳并发连接数设置 mysql是单进程,多线程的架构,通过创建多个线程来服务不同的用户连接,通常情况下,随着用户连接数的增加,mysql内部用于处理用户连接的线程也会同步的增长 ...

  7. Ubuntu18.04.3主力开发机使用记录(一)

    现在是2019年12月02日,在公司使用Ubuntu作为开发机器已经有一段时间了 查看主分区创建时间 安装时间8月26 当时周一,一个新的迭代刚刚开始,早上来到公司发现开不了机:Windows报错蓝屏 ...

  8. TP5之事务处理

    事务: 执行完A事件然后执行B事件,AB事件都执行完才算完成.可是有时候由于某些因素,A事件执行完,还没来得及执行B事件.怎么办?就需要回到A事件执行前.这种事情多见于电商支付功能. mysql事务要 ...

  9. 企业场景-网站目录安全权限深度讲解及umask知识

    站点目录的文件和目录给什么权限: 默认权限是安全权限的临界点,工作中尽量给这个临界点,或者小于临界点,不要大于临界点权限. 默认权限分配的命令 umask 在linux下文件的默认权限是由umask值 ...

  10. MongoDB对数组元素及内嵌文档进行增删改查操作

    比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: {    "_id" : "195861",    &qu ...