sql注入攻击和PreparedStatement有效防止sql注入攻击

【1】sql注入攻击:

/*** SQL 注入.*/@Testpublic void testSQLInjection() {String username = "a' OR PASSWORD = ";String password = " OR '1'='1";String sql = "SELECT * FROM user_tbl WHERE user_name = '" + username+ "' AND " + "password = '" + password + "'";// sql注入攻击使用的sql: SELECT * FROM user_tbl WHERE user_name = 'a' OR PASSWORD = ' AND password = ' OR '1'='1'System.out.println(sql);Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {connection = JdbcUtils.getConnection();statement = connection.createStatement();resultSet = statement.executeQuery(sql);if (resultSet.next()) {System.out.println("登录成功!");} else {System.out.println("用户名和密码不匹配或用户名不存在. ");}} catch (Exception e) {e.printStackTrace();} finally {JdbcUtils.closeStatAndConnAndResultSet(statement, connection, resultSet);}}

【2】PreparedStatement 有效防止sql注入攻击

/*** 使用 PreparedStatement 将有效的解决 SQL 注入问题.*/@Testpublic void testSQLInjection2() {String username = "a' OR PASSWORD = ";String password = " OR '1'='1";String sql = "SELECT * FROM user_tbl WHERE user_name = ? "+ "AND password = ?";Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {connection = JdbcUtils.getConnection();preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, username);preparedStatement.setString(2, password);resultSet = preparedStatement.executeQuery(); // 这里查询失败if (resultSet.next()) {System.out.println("登录成功!");} else {System.out.println("用户名和密码不匹配或用户名不存在. ");}} catch (Exception e) {e.printStackTrace();} finally {JdbcUtils.closeStatAndConnAndResultSet(preparedStatement, connection, resultSet);}}

【3】代码补充:jdbc工具类 

/*** 操作jdbc的工具类-封装了一些工具方法* @author pacoson*/
public class JdbcUtils {/*** 通用的更新方法:insert, update, delete* 版本1* @param sql*/public static void updateV2ByPreparedStatement(String sql, Object... objs) {Connection conn = null;PreparedStatement stat = null;try {// 1.获取数据库连接conn = JdbcUtils.getConnection();// 4.执行插入// 4.1 获取操作sql语句的statement对象; 
//			调用Connection的  createStatement() 方法来获取stat = conn.prepareStatement(sql);int i = 1;for (Object obj : objs) {stat.setObject(i++, obj);}System.out.println("连接=" + conn + ",语句 = " + stat);// 4.2 调用statement对象的 executeUpdate(sql) 执行sql语句进行插入int updateRows = stat.executeUpdate();System.out.println("更新记录行数:" + updateRows);} catch(Exception e) {e.printStackTrace();} finally {JdbcUtils.closeStatAndConn(stat, conn);}}/*** 通用的更新方法:insert, update, delete* 版本1* @param sql*/public static void updateV1(String sql) {Connection conn = null;Statement stat = null;try {// 1.获取数据库连接conn = JdbcUtils.getConnection();// 4.执行插入// 4.1 获取操作sql语句的statement对象; 
//			调用Connection的  createStatement() 方法来获取stat = conn.createStatement();System.out.println("连接=" + conn + ",语句 = " + stat);// 4.2 调用statement对象的 executeUpdate(sql) 执行sql语句进行插入int updateRows = stat.executeUpdate(sql);System.out.println("更新记录行数:" + updateRows);} catch(Exception e) {e.printStackTrace();} finally {JdbcUtils.closeStatAndConn(stat, conn);}}/*** 获取连接的方法。* 通过读取配置文件从数据库服务器获取一个连接* @return* @throws Exception*/public static Connection getConnection() throws Exception {// 读取类路径下的 jdbc.properties 文件并将其封装到 Properties中:InputStream in = JdbcTest01.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties props = new Properties();props.load(in);/* 通过反射获取驱动器Driver */Driver driver = (Driver) Class.forName(props.getProperty("driver")).newInstance();/* 获取数据库连接  */Connection conn = driver.connect(props.getProperty("url"), props);return conn;}/*** 关闭数据库语句 statement 和 数据库连接 conn 和 结果集 ResultSet* @param stat* @param conn*/public static void closeStatAndConnAndResultSet(Statement stat, Connection conn, ResultSet rs) {if (null != rs) {try {rs.close(); // 关闭ResultSet对象} catch(Exception e) {e.printStackTrace();}}if (null != stat) {try {stat.close(); // 关闭statement对象} catch(Exception e) {e.printStackTrace();}}if (null != conn) {try {conn.close(); // 关闭连接} catch(Exception e) {e.printStackTrace();}}}/*** 关闭数据库语句 statement 和 数据库连接 conn * @param stat* @param conn*/public static void closeStatAndConn(Statement stat, Connection conn) {if (null != stat) {try {stat.close(); // 关闭statement对象} catch(Exception e) {e.printStackTrace();}}if (null != conn) {try {conn.close(); // 关闭连接} catch(Exception e) {e.printStackTrace();}}}}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MVC之新增

在我们使用ASP.NET MVC时,用得最多的一定是数据的增删查改吧。我今天就讲一下,到底是如何实现数据的新增的。 顺序大概是这样的,比如:有一个新增的按钮,我们要点击它然后弹出一个模态框,我们要在模态框的in…

MySQL的表数据复制

A表B表复制A表的数据code到B表 一、普通SQL UPDATE A a,B b set b.codea.code where a.nameb.name; 二、存储过程 #定义复制存储过程 drop procedure if exists copy_A_to_B; create procedure copy_A_to_B() begindeclare a_name varchar(255);declare a_code varchar(255);de…

MVC之查询

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.04.13我之前已经写过新增了,那么现在我来写一下查询。查询很多地方都会用到吧,比如我们要让数据在表格显示出来就要用查询来让表格数据初始化&#xf…

java反射的工具类的函数集合

import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;/*** 反射的 Utils 函数集合* 提…

Spring Boot Server容器配置

转载自 Spring Boot Server容器配置参数配置容器 server.xx开头的是所有servlet容器通用的配置,server.tomcat.xx开头的是tomcat特有的参数,其它类似。 所有参数绑定配置类:org.springframework.boot.autoconfigure.web.ServerProperties 代码…

MVC之删除

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.04.17在页面的数据表格中,既然有新增,那一定也有删除吧。那MVC是怎么写删除的呢,就让我来讲一下吧。 删除一般有删除单条数据和删除多条数…

转】Eclipse编辑Spring配置文件xml时自动提示类class包名

转自 http://bigdragon.iteye.com/blog/2396081 第一步,先查看下自己的Eclipse是什么版本,步骤如下: 1.1 点击Eclipse菜单‘Help -> About Eclipse’,如下图: 1.2 点击Eclipse图标如下,看清楚哦&…

Spring Boot读取配置的几种方式

转载自 Spring Boot读取配置的几种方式读取application文件 在application.yml或者properties文件中添加: info.addressUSA info.companySpring info.degreehighValue注解读取方式import org.springframework.beans.factory.annotation.Value; import org.springfra…

MVC之修改

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.04.24ASP.NET MCV的增删查改在我前面的讲解中,我已经把前三个都说了一下,现在就只剩下修改没讲了。所以,我今天就给你们讲一下&#xff0c…

VMnet1和VMnet8 未识别的网络的解决方法

转自: https://blog.csdn.net/jackphang/article/details/8939738 我的系统是win7 64位,它居然不能识别VMnet1和VMnet8,在网上找了些资料,发现所有资料都是一样的。不过事实证明是正确的。 解决办法: 1,在…

jps命令:查看Java进程等详细信息

转载自 jps命令:查看Java进程等详细信息jps是java自带的查看java进程的命令,通过这个命令可以查看当前系统所有运行中的java进程、java包名、jar包名及JVM参数等。jps -help 可以查看命令用法。-q: 只显示VM 标示,不显示jar,class, main参数等…

MVC如何添加Model

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.04.27初步学习MVC编程模式的时候,我基本清楚了如何创建MVC,而添加model(模型)似乎还不够理解,通过学习我大概了解了…

在win10系统中安装Visual C++ 6.0的具体方法

转自: https://blog.csdn.net/qq_39235641/article/details/79102694 很多学C语言的同学很熟悉VC6.0,但是在win10系统下,VC6.0便无法打开,报错:0x0000142。这是因为汉化版本和最新的win10系统兼容性不好导致的。win10…

如何设计一个安全的登录流程

转载自 如何设计一个安全的登录流程登录是系统中最重要的一个功能之一,登录成功就能拥有系统的使用权利,所以设计一个安全的登录流程是十分必要的,那在一般登录中需要考虑哪些重要因素呢?我们一一列表一下。使用https协议进行传输…

如何导入数据模板到MVC

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.5.3在平常的生活中,我们可能需要添加大量的数据,这时一条一条地新增肯定不能满足我们的要求了,所以我们就需要批量导入数据了。现在我就来…

在左表或右表的连接字段上建立索引对左、内连接的查询效率的优化情况分析

-- 1、建表 drop table if exists dept_tbl;create table dept_tbl (rcrd_id int unsigned primary key auto_increment comment 记录编号, dept_id int unsigned not null comment 部门编号) engine innodb default charsetutf8 comment 部门表;drop table if exists emp_tb…

并发控制--悲观锁和乐观锁详解

转载自 并发控制--悲观锁和乐观锁详解背景考虑下面两个并发带来的问题:1、丢失更新:一个事务的更新结果覆盖了其它事务的更新结果,即所谓的更新丢失。2、脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。…

如何导出数据到Excel表格

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.5.5我们在日常的生活中常常会看到很多的数据,有时,我们不一定只是在项目里面看到数据,可能我们还要在其他的地方使用,这时我们…

mysql批量插入数据的函数和存储过程

-- 创建函数前,设置 set global log_bin_trust_function_creatorsTRUE; -- 新建函数-产生随机的字符串 drop function if exists rand_str; delimiter ## create function rand_str(n int) returns varchar(255) begin declare chars_str varchar(100) default abc…

打印水晶报表

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.5.8我们在日常生活中常常会打印很多东西,所以我打算讲一下是怎么打印水晶报表的。 打印水晶报表其实和导出差不多,只是有一点不同。打印也用到了多条件…