PreparedStatement防止SQL注入
添加数据:
package com.hyc.study03;
import com.hyc.study02.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestInsert {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//3、获取数据库连接connection = JDBCUtils.getConnection();//使用?占位符替代参数String sql = "INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`) " +"VALUES (?,?,?,?,?);";//4、获取执行sql的对象//预编译sql,先写sql,然后不执行preparedStatement = connection.prepareStatement(sql);//手动给参数赋值preparedStatement.setInt(1, 4);preparedStatement.setString(2, "hyc");preparedStatement.setString(3, "123456");preparedStatement.setString(4, "123456789@qq.com");//java.sql.Date 是数据库的Date ,只包含年月日信息 ,它是java.util.Date(包含年月日和时分秒信息)的子类preparedStatement.setDate(5, new java.sql.Date(new Date().getTime()));//5、执行sql语句//6、返回执行结果集int num = preparedStatement.executeUpdate();if (num > 0) {System.out.println("插入数据成功!");}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//7、释放连接JDBCUtils.release(connection, preparedStatement, resultSet);}}
}
删除数据:
package com.hyc.study03;import com.hyc.study02.utils.JDBCUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestDelete {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//3、获取数据库连接connection = JDBCUtils.getConnection();//使用?占位符替代参数String sql = "DELETE FROM `users` WHERE id=?";//4、获取执行sql的对象//预编译preparedStatement = connection.prepareStatement(sql);//手动给参数赋值preparedStatement.setInt(1, 4);//5、执行sql语句//6、返回执行结果集int num = preparedStatement.executeUpdate();if (num > 0) {System.out.println("删除数据成功!");}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//7、释放连接JDBCUtils.release(connection, preparedStatement, resultSet);}}
}
修改数据:
package com.hyc.study03;
import com.hyc.study02.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestUpdate {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//3、获取数据库连接connection = JDBCUtils.getConnection();//使用?占位符替代参数String sql = "UPDATE `users` SET `NAME`=?,`email`=? WHERE `id`=?";//4、获取执行sql的对象//预编译preparedStatement = connection.prepareStatement(sql);//手动给参数赋值preparedStatement.setString(1, "zhangsan");preparedStatement.setString(2, "zhangsan@sina.com");preparedStatement.setInt(3, 1);//5、执行sql语句//6、返回执行结果集int num = preparedStatement.executeUpdate();if (num > 0) {System.out.println("更新数据成功!");}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//7、释放连接JDBCUtils.release(connection, preparedStatement, resultSet);}}
}
查询数据:
package com.hyc.study03;
import com.hyc.study02.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestSelect {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//3、获取数据库连接connection = JDBCUtils.getConnection();//使用?占位符替代参数String sql = "SELECT * FROM `users` WHERE id=?";//4、获取执行sql的对象//预编译preparedStatement = connection.prepareStatement(sql);//手动给参数赋值preparedStatement.setInt(1, 1);//5、执行sql语句//6、返回执行结果集resultSet = preparedStatement.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getString("NAME"));}} catch (SQLException throwables) {throwables.printStackTrace();} finally {//7、释放连接JDBCUtils.release(connection, preparedStatement, resultSet);}}
}
PreparedStatement防止SQL注入:
PreparedStatement防止SQL注入的本质是将传递进来的参数当做字符(想当于给传进来的参数包装成一个新的字符串),如果其中存在转义字符,例如 ‘ 会被直接转义。这样能够避免字符串拼接成非法的sql语句,造成数据泄露。
package com.hyc.study03;
import com.hyc.study02.utils.JDBCUtils;
import java.sql.*;public class PourIntoSql {public static void main(String[] args) {login("'' or '1=1", "123456");}public static void login(String username, String psw) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {connection = JDBCUtils.getConnection();String sql = "SELECT * FROM `users` WHERE `NAME`=? AND `PASSWORD`=?";preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, username);preparedStatement.setString(2, psw);resultSet = preparedStatement.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getString("NAME"));System.out.println("===========================================");}} catch (SQLException throwables) {throwables.printStackTrace();} finally {JDBCUtils.release(connection, preparedStatement, resultSet);}}
}
结果:
在PreparedStatement的作用下,再尝试通过字符串拼接达到SQL注入的目的无法实现。
PreparedStatement防止SQL注入相关推荐
- 通过PreparedStatement预防SQL注入
通过PreparedStatement预防SQL注入 简介:本文只讲PreparedStatement预防SQL注入的写法,大家学会就好. 推荐学习路线:JDBC数据库的连接->Connecti ...
- JDBC中使用preparedStatement防止SQL注入
一.SQL注入 SQL注入是一种比较常见的网路攻击方式,一些恶意人员在需要用户输入的地方,恶意输入SQL语句的片段,通过SQL语句,实现无账号登录,甚至篡改数据库. 二.SQL注入实例 登录场景: 在 ...
- Statement和PreparedStatement(SQL注入问题)
用于执行静态SQL语句并返回其生成的结果的对象.也就是说它是帮我们执行SQL语句,并且返回一个结果,就是干这个事情. 我们在连接建立以后,需要对数据库进行访问,执行命令或者是SQL语句,可以通过 St ...
- JDBC--代码实现增删改查、及SQL注入问题解决
Startment.PreparedStatement对象详解及SQL注入问题 (1)Statement对象详解 1.提取工具类 #db.properties dirver=com.mysql.jdb ...
- 怎么进行mysql注入测试_MySQL for Java的SQL注入测试
只要你学JDBC,基本上所有的人都会和你说,Statement不能防止SQL注入, PreparedStatement能够防止SQL注入. 基本上参加工作了一段时间之后还是这么认为的, 没错, 这句是 ...
- MySQL for Java的SQL注入测试
2019独角兽企业重金招聘Python工程师标准>>> 只要你学JDBC,基本上所有的人都会和你说,Statement不能防止SQL注入, PreparedStatement能够防止 ...
- sql 整改措施 注入_记一次Sql注入 解决方案
老大反馈代码里面存在sql注入,这个漏洞会导致系统遭受攻击,定位到对应的代码,如下图所示 image like 进行了一个字符串拼接,正常的情况下,前端传一个 cxk 过来,那么执行的sql就是 se ...
- JDBC模拟SQL注入和避免SQL注入
模拟用户登录 用户名:fdsa 密码:fdsa' or '1'='1 select * from t_user where login_name='fdsa' and login_pwd='fdsa' ...
- MYSQLg高级-----SQL注入的理解(初级篇)以及如何防止注入
SQL注入 1.SQL 注入概念 1.1 SQL注入是什么? 1.2 SQL注入定义 1.3 SQL注入特点 1.广泛性 2.隐蔽性 3.危害大 4.操作方便 1.4 SQl注入原理 1.5 SQl注 ...
- java回顾:JDBC、工具类、事务、SQL注入
目录 1.概念 2.JDBC核心API的介绍 2.1 JDBC四个核心对象 2.2 JDBC访问数据库的步骤 3.JDBC注册驱动 3.1 jdbc测试 3.2 注册驱动 4.获取连接 4.1 AP ...
最新文章
- JZOJ__Day 8:【普及模拟】马农
- nvr服务器系统,【64路IPC网络存储服务器(WNVR)】 - 太平洋安防网
- 字符设备驱动基础篇2——用开发板来调试驱动模块的步骤
- sis 最新_《炙热的我们》火箭少女首胜,sis姐妹花遭遇惨败出局?
- 2014百度之星资格赛——Disk Schedule
- MMP,我说每年年会我怎么老是中不了奖,原来是这样
- 2022-03-07 学习docker开发vue前端
- php dao 接口,SSH中公共Dao层、Dao接口
- 2018.01.07软件更新公告
- 海康摄像机取流RTSP地址规则说明
- 解除极域电子教室软件控屏的方法
- QAC静态测试配置及使用教程
- 再深一点:如何给女朋友解释什么是微服务?
- 干货!网络推断与数据驱动的影响力最大化问题
- 现在投资最校园跑腿可行吗?
- 2021年 Python工程师平均薪资22K,又涨了11.9%!
- 中文字体设置fontFamily无效
- Python全栈开发【第一篇】:初识Python
- Unity第三人称控制实现方式
- 番茄花园GhostXP SP3极速装机版V03