jdbc java数据库连接 8)防止sql注入
回顾下之前jdbc的开发步骤:
1:建项目,引入数据库驱动包
2:加载驱动
Class.forName(..);
3:获取连接对象
4:创建执行sql语句的stmt对象; 写sql
5:执行sql
a) 更新 delete/insert/update
!:executeUpdate();
b) 查询 select
!:executeQuery();
6:关闭/异常
之前有说过,Statement接口和PreparedStatement接口的区别,其中的一个就是:
PreparedStatement接口能够防止sql注入
那么,什么是sql注入呢?
其实sql注入就是用户输入的恶意密码,能够绕过你的用户名和密码登陆。
例子:
1:首先创建个数据库
-- 创建数据库
CREATE DATABASE jdbc_demo DEFAULT CHARACTER SET utf8;i
-- 创建表
USE jdbc_demo;
CREATE TABLE admin(
id INT PRIMARY KEY AUTO_INCREMENT,
userName VARCHAR(20),
pwd VARCHAR(20)
)
2:使用Statement接口,没有防止sql注入:
/**
* 模拟用户登陆数据库,演示注入
*
* @author LLZ
*/
public class Two_StatementDemo { /**
* 1:sql注入 Statement
*/ private Connection conn;
private Statement stsm;
private ResultSet rs;
private PreparedStatement pstsm; @Test
public void Test1() { String user = "tom";
// String password = "123";
String password = " ' or 1=1 -- /**/ "; // sql注入,这个也可以登陆成功 try {
// 1.1:加载驱动
conn = Jdbcutil.getConnection(); // 1.3:创建Statement对象
stsm = conn.createStatement(); // 1.4:准备sql语句
String sql = "select * from jdbc where user='" + user
+ "' and password='" + password + "' "; // 1.5:执行sql
rs = stsm.executeQuery(sql); // 1.6:打印返回的结果
if (rs.next()) {
System.out.println(rs.getInt("id"));
}
} catch (Exception e) {
e.printStackTrace(); } finally {
// 1.7:关闭连接
try {
rs.close();
stsm.close();
conn.close();
} catch (Exception e) { e.printStackTrace();
}
}
}
3:使用PreparedStatement接口,防止sql注入:
其原因就是由于该接口具有缓存区,需要先执行预编译远,等传入参数才正式执行sql语言
/**
* 二:用PreparedStatement防止sql注入
*/
@Test
public void Test2() { String user = "tom";
String password = "123";
// String password = " ' or 1=1 -- /**/ "; // sql注入,这个在这里就无法登陆
// 准备sql预编译语句
String sql = "select * from jdbc where user=? and password=?"; try {
// 2.1:创建连接
conn = Jdbcutil.getConnection(); // 2.2:创建PerparedStatement对象(执行预编译)
pstsm = conn.prepareStatement(sql); // 2.3:准备参数
pstsm.setString(1, user);
pstsm.setString(2, password); // 2.4:发送参数,执行sql
ResultSet rs = pstsm.executeQuery();
if (rs.next()) {
System.out.println(rs.getInt("id"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 2.5:关闭连接
Jdbcutil.close(conn, pstsm, rs);
} }
jdbc java数据库连接 8)防止sql注入的更多相关文章
- jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件
day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一 ...
- Java学习之路- SQL注入
用户名: __________ 密码:——————— 假如没有使用预处理的Statement 对象 拼接字符串查数据库的话,易收到sql注入攻击: 例如说 : mysql 中 #代表的是单行注释 ...
- JDBC中的PreparedStatement-防止SQL注入攻击
在JDBC对数据库进行操作的时候,SQL注入是一种常见的针对数据库的注入攻击方式.如下面的代码所演示,在我们的提交字段中掺入了SQL语句,会使得程序的登录校验失效: package org.lyk.m ...
- 【挖坑】2019年JAVA安全总结:SQL注入——新项目的开发与老项目的修复
如何在项目中有效的防止SQL注入 写给需要的人,所有的问题源自我们的不重视. 本章略过"什么是SQL注入","如何去利用SQL注入"的讲解,仅讲如何去防御 PS ...
- MySQL_(Java)使用preparestatement解决SQL注入的问题
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL数据库中的数据,数据库名garysql,表名gar ...
- Java代码审计连载之—SQL注入
前言近日闲来无事,快两年都没怎么写代码了,打算写几行代码,做代码审计一年了,每天看代码都好几万行,突然发现自己都不会写代码了,真是很DT.想当初入门代码审计的时候真是非常难,网上几乎找不到什么java ...
- jdbc操作数据库以及防止sql注入
public class pr { public static void main(String[] args) { Connection conn = null; Statement st = nu ...
- jdbc java数据库连接 11)中大文本类型的处理
1. Jdbc中大文本类型的处理 Oracle中大文本数据类型, Clob 长文本类型 (MySQL中不支持,使用的是text) Blob 二进制类型 MySQL数据库, Text ...
- jdbc java数据库连接 6)类路径读取——JdbcUtil的配置文件
之前的代码中,以下代码很多时候并不是固定的: private static String url = "jdbc:mysql://localhost:3306/day1029?useUnic ...
随机推荐
- 【分布式】Zookeeper系统模型
一.前言 前面已经讲解了Zookeeper的一些应用场景,但是并没有深入到Zookeeper内部进行分析,本篇将讲解其系统模型. 二.系统模型 2.1 数据模型 Zookeeper的数据节点称为ZNo ...
- 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值
前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...
- 利用Python进行数据分析(12) pandas基础: 数据合并
pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...
- 【中文分词】隐马尔可夫模型HMM
Nianwen Xue在<Chinese Word Segmentation as Character Tagging>中将中文分词视作为序列标注问题(sequence labeling ...
- 详解:基于WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器功能
文件同步传输工具比较多,传输的方式也比较多,比如:FTP.共享.HTTP等,我这里要讲的就是基于HTTP协议的WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器这样的一个工具(简称:一 ...
- 笔记:解决VS2015 不能加载.edmx 的解决方案
1. 首先你要安装 VS2015镜像中的packages->EFTools文件(最后拷贝出来,因为发现直接运行其下的EFTools.msi文件安装会有问题),然后安装里面的EFTools.msi ...
- Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池
连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...
- ASP模拟POST请求异步提交数据的方法
这篇文章主要介绍了ASP模拟POST请求异步提交数据的方法,本文使用MSXML2.SERVERXMLHTTP.3.0实现POST请求,需要的朋友可以参考下 有时需要获取远程网站的某些信息,而服务器又限 ...
- 全国SHP地图数据赠送
百度搜索:GIS之家获取全国SHP图层数据的方式:收藏(ArcGIS地图全国电子地图shp格式版本GIS地图数据.GIS开发顺德政府GIS公共服务共享平台),并且截图验证,验证通过后,收下邮箱,我把下 ...
- 清空Fragment回退栈中某个Fragment
出栈的方法:getActivity().getSupportFragmentManager().popBackStackImmediate(CreateOneFragment.class.getNam ...