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 ...
随机推荐
- Node.js:console模块
console模块提供了一个简单的调试功能,类似与web浏览器的javscript console. 下面简单介绍下该模块的使用以及用途,我使用了ES6的模版字符串(使用反引号标识),有兴趣的可以去了 ...
- ERROR 1010 (HY000): Error dropping database (can't rmdir './test/', errno: 17)
在删除数据库的时候报标题所示错误 mysql> drop database test; ERROR (HY000): Error dropping database (can't rmdir ' ...
- JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面 ...
- DotLiquid模板引擎简介
DotLiquid是一个在.Net Framework上运行的模板引擎,采用Ruby的Liquid语法,这个语法广泛的用在Ruby on rails和Django等网页框架中. DotLiquid相比 ...
- 2.C#WinForm基础Email分析器
功能:输入Email地址,输出用户名和域名 string[] String.split(params char[] separator)(+5重载)) 返回的字符串数组包含此实例的字符串(由指定Uni ...
- Coding4Fun Toolkit支持本地化解决办法
在项目中需要使用Coding4Fun Toolkit中的TimePicker控件, 1. 但是在中文系统下显示的却是英文: 2. 最后发现,需要在源代码中添加中文资源,并重新编译出包含中文语言的dll ...
- Cesium原理篇:5最长的一帧之影像
如果把地球比做一个人,地形就相当于这个人的骨骼,而影像就相当于这个人的外表了.之前的几个系列,我们全面的介绍了Cesium的地形内容,详见: Cesium原理篇:1最长的一帧之渲染调度 Cesium原 ...
- conversations.im
最后在即时消息 https://conversations.im/ https://github.com/chrisballinger/ 对话是Android 4.0的Jabber / XMPP客户 ...
- 不懂CSS也能定制博客界面!
之前没想过定制博客界面,毕竟CSS,HTML什么的都不懂,不过看了这篇文章分分钟搞定: [详细图解]一步一步教你自定义博客园(cnblog)界面 我是基于模板BlueSky做了些改动,先看修改前后的效 ...
- 设计模式(十)组合模式(Composite Pattern)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...