MySQL for Java的SQL注入测试

只要你学JDBC,基本上所有的人都会和你说,Statement不能防止SQL注入, PreparedStatement能够防止SQL注入.

基本上参加工作了一段时间之后还是这么认为的, 没错, 这句是没有问题的, 但到底如何进行SQL注入?怎么直观的去了解SQL注入?这还是需要花一定的时间去实验的.

 

前提:以下的测试都是在一种理想环境下

 

首先准备好数据库环境, 以下是数据库的schema:

create database java_mysql;  
  
use java_mysql;  
  
drop table if exists pstest;  
  
create table pstest(  
    id int(10) not null primary key auto_increment,  
    name varchar(32),  
    age int(3)  
);  
  
insert into pstest (name, age) values ('Tom', 23);  
insert into pstest (name, age) values ('Tom1', 23);  
insert into pstest (name, age) values ('Tom2', 23);  
insert into pstest (name, age) values ('Tom3', 23);  
insert into pstest (name, age) values ('Tom4', 23);  
insert into pstest (name, age) values ('Tom5', 23);
 
 以上就是建立了pstest表, 并插入了一些测试数据. 

1. 测试Statement
public class StatementTest {  
    public static void main(String[] args) throws SQLException {  
        Connection con = null;  
        Statement stmt = null;  
        // name很强大, 传入了这么多东西  
        String name = "Tom';delete from pstest;select * from pstest where name='Tom";  
        String sql = createSql(name);   // SQL  
        System.out.println(sql);  
          
        try {  
            con = DBConn.getConnection();  
            stmt = con.createStatement();  
              
            stmt.execute(sql);  
        } catch(Exception e) {  
            e.printStackTrace();  
        } finally {  
            stmt.close();  
            con.close();  
        }  
    }  
      
    // 根据参数的name参数查询  
    private static String createSql(String name) {  
        String sql = "select id, name, age from pstest ";  
          
        // 拼接一下SQL  
        if(name != null && name.length() != 0) {  
            sql += "where name ='" + name + "'";  
        }  
          
        return sql;  
    }  
}  
 

数据库连接的URL为:
"jdbc:mysql://localhost:3306/java_mysql";
其实上面的意图很简单:
Tom';delete from pstest;select * from pstest where name='Tom
就是想先执行一条SQL查询语句,然后把表的数据删除。 
这只是理想环境. 实际上要想传入这么复杂的数据, 真的很难想象

 这里将URL单独拎出来是有作用的, 继续看下面

Run一下StatementTest. 会发现报异常了:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'delete from pstest;select * from pstest where name='Tom'' at line 1  
  想法很简单, 现实很残酷, 未能如所愿.

看到这里,你也应该想到了Statement的execute(String sql)默认是只能执行一条SQL的.

若想让execute(String sql)能够同时只能几条SQL语句, 怎么办?修改连接的URL:

jdbc:mysql://localhost:3306/java_mysql?allowMultiQueries=true
 
 重点是allowMultiQueries=true这个参数
再来Run一下StatementTest. OK,没有报任何的异常.打印的SQL为:
select id, name, age from pstest where name ='Tom';delete from pstest;select * from pstest where name='Tom';
 上面的SQL到底做了什么呢?
我们先观察一下:第一条是查询SQL, 第二条是delete, 第三条是查询SQL,其实第一条和第三条是一样的.
为了直观的看上面SQL的执行效果, 我们再次执行下最开始的schema.sql 
这时候数据库有6条数据
mysql> select * from pstest;  
+----+------+------+  
| id | name | age  |  
+----+------+------+  
|  1 | Tom  |   23 |  
|  2 | Tom1 |   23 |  
|  3 | Tom2 |   23 |  
|  4 | Tom3 |   23 |  
|  5 | Tom4 |   23 |  
|  6 | Tom5 |   23 |  
+----+------+------+  
 

执行一下

select id, name, age from pstest where name ='Tom';delete from pstest;select * from pstest where name='Tom';  
 
 这时候可以看到MySQL客户端
mysql> select id, name, age from pstest where name ='Tom';delete from pstest;select * from pstest where name='Tom';  
    +----+------+------+  
    | id | name | age  |  
    +----+------+------+  
    |  1 | Tom  |   23 |  
    +----+------+------+  
    1 row in set (0.00 sec)                 -- 执行第一条查询SQL  
      
    Query OK, 6 rows affected (0.05 sec)    -- 执行第二条delete语句, Oh, No, 数据库全部的6条数据被删除了  
      
    Empty set (0.00 sec)                     -- 执行第三条SQL查询, 没有查询到任何数据
 
上面的注释已经写好了,就不多说了。

这时候的确已经实现了SQL注入.


2. 测试PreparedStatemet
public class PreparedStatementTest {  
    public static void main(String[] args) throws SQLException {  
        Connection con = null;  
        PreparedStatement ps = null;  
        ResultSet rs = null;  
        String sql = "select id, name, age from pstest where name = ? ";  
          
        try {  
            con = DBConn.getConnection();  
            ps = con.prepareStatement(sql);   
            ps.setString(1, "Tom';delete from pstest;select * from pstest where name='Tom");      
            rs = ps.executeQuery();   
        } catch(Exception e) {  
            e.printStackTrace();  
        } finally {  
            rs.close();  
            ps.close();  
            con.close();  
        }  
    }  
}
 

直接Run一下,OK,也没出现任何的异常,数据库中的数据也还在
但是我们到底执行了什么样的SQL, 查看MySQL的日志.
这里简单提下MySQL的日志,可以在my.ini下配置
[mysqld]   
log=MySQL_Log    # 在这里加上日志名称
 这时候会在MySQL/MySQL Server 5.1/Data/目录下生成MySQL_Log文件, 里面记录的就是日志了.

好了,回到正题,看一下刚刚PreparedStatementTest执行的SQL,在MySQL_Log中查看


120719 15:54:25      23 Connect   root@localhost on java_mysql  
           23 Query /* mysql-connector-java-5.1.20-SNAPSHOT ( Revision: ${bzr.revision-id} ) ...  
           23 Query SHOW WARNINGS  
           23 Query /* mysql-connector-java-5.1.20-SNAPSHOT ( Revision: ${bzr.revision-id} ) */SELECT @@session.auto_increment_increment  
           23 Query SHOW COLLATION  
           23 Query SET character_set_results = NULL  
           23 Query SET autocommit=1  
           23 Query select id, name, age from pstest where name = 'Tom\';delete from pstest;select * from pstest where name=\'Tom'  
           23 Quit    
 
 重点是最后一条SQL.
因为数据库中的数据都还在,我们就直接执行这条SQL

select id, name, age from pstest where name = 'Tom\';delete from pstest;select * from pstest where name=\'Tom'
 
查看MySQL的客户端
mysql> select id, name, age from pstest where name = 'Tom\';delete from pstest;select * from pstest where name=\'Tom';  
   Empty set (0.00 sec)                     -- 就执行了这一条查询的SQL语句 
 
可以看到什么的字符串已经被转义了.
让我们来看一下转义字符:
mysql> select 'Tom\';delete';  
+-------------+  
| Tom';delete |  
+-------------+  
| Tom';delete |  
+-------------+  
1 row in set (0.00 sec)
 

总结:其实从上面的测试中已经看出了。的确Statement是不安全的, 可以进行SQL注入, 而PreparedStatement可以防止SQL注入。就好比上面我们想在做查询的时候将pstest中的全部数据都删除掉一样. 前面已经说过这是在理想的环境下做的测试. 在真正的环境中,就想这么简单的实现SQL注入, 基本上是不可能的。而且Statemenet,让它执行execute(String sql)的时候同时执行多条SQL, 基本上不可能会去这么做的.

其实,关于Statement的execute(String sql)语句能够同时执行多条SQL语句, 可以看MySQL自带的测试例子:
可查看testsuite.regression包下的ResultSetRegressionTest类:
public class ResultSetRegressionTest extends BaseTestCase {  
    public void testBug33678() throws Exception {  
        if (!versionMeetsMinimum(4, 1)) {  
            return;  
        }  
  
        createTable("testBug33678", "(field1 INT)");  
  
        // allowMultiQueries=true设置  
        Connection multiConn = getConnectionWithProps("allowMultiQueries=true");  
        Statement multiStmt = multiConn.createStatement();  
  
        try {  
            multiStmt.setFetchSize(Integer.MIN_VALUE);  
  
            // 一次性执行多条SQL语句  
            multiStmt  
                    .execute("SELECT 1 UNION SELECT 2; INSERT INTO testBug33678 VALUES (1); UPDATE testBug33678 set field1=2; INSERT INTO testBug33678 VALUES(3); UPDATE testBug33678 set field1=2 WHERE field1=3; UPDATE testBug33678 set field1=2; SELECT 1");  
      
    // 以下代码省略...  
    }  
}
 




Java医院挂号系统:Swing GUI与MySQL事务实战指南 GUI界面开发与数据库事务是Java工程能力的两大基石。Swing作为轻量级桌面GUI框架,其事件分发机制、线程安全模型和布局约束逻辑,深刻映射Java内存模型与响应式编程思想;而MySQL中的SELECT ... FOR UPDATE、连接池管理与PreparedStatement参数化查询,则是理解ACID事务、并发控制与SQL注入防御的核心入口。二者结合构成典型的‘前端交互+后端数据一致性’闭环训练场,广泛应用于课程设计、技术面试验证及中小型业务系统原型开发。本文以医院挂号系统为载体,详解SwingW 阅读详情

相关推荐

电商秒杀场景下,如何用Redis+Lua脚本实现原子性库存扣减(附完整代码)

本文针对电商秒杀场景下的高并发与超卖难题,详细解析了如何利用Redis的原子性命令与Lua脚本实现可靠的库存扣减。通过对比多种方案,阐述了Redis+Lua作为黄金搭档的技术原理,并提供了从基础扣减到预扣减模型的完整代码实现,确保在高并发下数据的一致性与系统性能。

weixin_29219539的博客 505

Java中的SQL注入简易分析

Java中的JDBC与Mybatis中的SQL注入简易分析

鸣蜩十四的博客 3574

Zemax实战:20×超高清变焦镜头设计全流程解析(从架构到制造)

本文详细解析了使用Zemax软件设计一款20倍变焦比、恒定F2.8光圈8K超高清镜头的全流程。从应对恒定光圈、宽光谱与8K解析力三大挑战的初始架构规划,到构建多重组态模型、分七阶段进行像差优化与公差分析,最终跨越制造鸿沟,为广播级影视与高精度工业检测应用提供了实战指南。

sun99的博客 552

javassist技术研究&Sql注入检测

javassist技术研究

我的心曾悲伤7次 1187

Unity 实现动态网格地图生成与交互组件

本文详细介绍了在Unity中实现动态网格地图生成与交互组件的完整方案。从基础网格单元实现到高级交互功能,涵盖网格生成器核心逻辑、事件驱动架构、性能优化技巧以及六边形网格等特殊实现。特别适合游戏开发者学习如何构建战棋、模拟经营类游戏的可交互地图系统,提升开发效率与用户体验。

weixin_29015483的博客 1072

如何用Arduino和HX711压力传感器制作一个简易电子秤(含OLED显示)

本文详细介绍了如何使用Arduino、HX711压力传感器和OLED显示屏制作一个简易电子秤。从硬件连接到软件编程,提供了分步教程,包括核心元件功能解析、接线方法、库安装、模块测试以及关键的校准流程。项目实践性强,适合创客和DIY爱好者学习嵌入式系统与传感器应用。

tea88的博客 537

JAVA代码审计篇-SQL注入

JAVA代码审计篇-SQL注入

m0_60571990的博客 1950

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 253

java sql简易注入测试

最近对SQL注入比较感兴趣,想着用java测试一下,首先进行了jdbc的简单连接,但是在结果运行的时候却没有得到我想要的结果。假设我有一个student表,我想要通过网页输入信息搜索指定信息(原功能),但是我想通过SQL注入获取到所有信息。我创建了一个表单,通过文本框将我的信息传输到servlet中进行处理。 select * from student where id ='1' or 1=1 正常情况下应该返回所有记录信息,但是响应时却只有id为1的记录(原表中数据不止一条)。后来经过多次测试与查找资料

yunchen523的博客 1061

【常见开源库的二次开发】基于openssl的加密与解密——openssl认识与配置(一)

OpenSSL 是一个开源的软件库,它提供了一系列加密工具和协议,主要用于实现安全通信,如在网络上的数据传输。它支持多种加密算法,包括对称加密、非对称加密、散列函数、伪随机数生成器、数字签名、密钥交换以及证书管理等。

嵌入式技术开发 4163

基于深度学习的水质预测:多参数监测与预测

首先,我们需要收集水质监测的多参数数据。收集到的数据应包括不同时间点的水质参数值以及相应的水质等级标签,用于训练和评估深度学习模型。同时,数据的质量和数量对于模型的性能也有重要影响,因此在实际应用中需要充分考虑数据的采集和处理过程。总之,基于深度学习的水质预测可以通过收集水质监测的多参数数据并使用适当的深度学习模型进行训练和预测来实现。通过以上的深度学习模型,我们可以利用水质监测的多参数数据进行水质预测。这种基于深度学习的方法可以提高水质预测的准确性和稳定性,为水质监测和环境保护提供有力支持。

web_bug407的博客 1103

怎么进行mysql注入测试_MySQL for Java的SQL注入测试

只要你学JDBC,基本上所有的人都会和你说,Statement不能防止SQL注入, PreparedStatement能够防止SQL注入.基本上参加工作了一段时间之后还是这么认为的, 没错, 这句是没有问题的, 但到底如何进行SQL注入?怎么直观的去了解SQL注入?这还是需要花一定的时间去实验的.前提:以下的测试都是在一种理想环境下首先准备好数据库环境, 以下是数据库的schema:create ...

weixin_42576410的博客 259

IPGUARD客户端与应用程序冲突

客户端与应用程序冲突 症状 安装客户端之后,客户端的某些程序无法运行或使用过程中出现异常,卸载客户端后恢复正常。 原因分析 可能是客户端的某些功能与应用程序发生冲突导致。 解决方法 当出现这样的情况时,可以按照以下步骤确认。 步骤1:屏蔽主动注入 在客户端配置策略中,增加配置策略hookapi_disinj,值为1;待策略同步到客户端后,重启客户端确认问题是否解决。如果解决,则转到...

IP-Guard专栏 1411

SQL注入基础总结

一、什么是SQL注入? 答:SQL注入是比较常见的网络攻击方式之一,它不是利用OS的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句实现无账号登陆,甚至篡改数据库。 二、SQL注入的原理? 答:SQL注入攻击通过构建特殊的输入语句作为参数传入web应用程序,指的是服务器对用户输入数据过滤不严,导致服务器SQL语句被恶意篡改并成功 SQL注入的危害? 当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。 SQL注入带来的危害主要有如

IerkeU的博客 4441

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java代码审计-SQL注入

Java代码审计之SQL注入

qq_44780157的博客 1352

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

渗透测试-SQL注入

sql注入是渗透测试重要的一部分,如果服务器存在sql注入漏洞将面临严重的威胁

weixin_53696027的博客 3104

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

以Java的视角来聊聊SQL注入

在正常情况下,用户会传入合法的name进行查询,但是黑客却会传入精心构造的参数,只要参数通过字符串拼接后依然是一句合法的SQL查询,此时SQL注入就发生了。JPA是Sun公司用来整合ORM技术,实现天下归一的ORM标准而定义的Java Persistence API(java持久层API),JPA只是一套接口,目前引入JPA的项目都会采用Hibernate作为其具体实现,随着无配置Spring Boot框架的流行,JPA越来越具有作为持久化首选的技术,因为其能让程序员写更少的代码,就能完成现有的功能。

通往IT大道的专栏 766

SQL 注入 漏洞测试 POP 注入 windows和Linux均可使用,已测试成功

SQL 注入 漏洞测试 POP 注入 windows和Linux均可使用,已测试成功 文末有彩蛋

李文昊的博客 2569

SQL注入攻击入门

目录 一、SQL注入的原理 SQL注入漏洞的条件 二、SQL注入的危害 三、SQL注入的分类 1、注入点数据类型分类 (1)数字型注入 (2)字符型注入 2、注入点位置分类 3、注入方法分类 (1)布尔型注入 (2)报错型注入 (3)延时注入 (4)联合查询注入 (5)宽字节注入 (6)多语句查询注入 四、SQL注入的防御 五、WAF绕过方法 六、SQLMAP 一、SQL注入的原理 SQL注入是一种针对后台数据库的攻击手段,攻击者把精心构造的恶意SQL命令插入到Web

xcxhzjl的博客 4002

sql注入-安全测试必备“7”个工具

SQL注入是一种常见的网络攻击方法,用于操作数据库管理系统,通过执行恶意的SQL语句来窃取或破坏数据。为了防御SQL注入攻击,了解和使用一些专业工具进行安全测试是非常有用的。以下是七个用于发现和测试SQL注入漏洞的重要工具,这些工具可帮助网络安全专业人士评估和加强应用程序的安全性。

2401_84466359的博客 3906

java sql注入例子

我着重强调几点:1、默认Statement和PreparedStatement,每次只能执行一条sql,对应mysql可以通过增加url参数&allowMultiQueries=true解决。2、mysql的注释,可以用#、"-- ",多行注释/* */。若使用"-- ",注意后面要有一个空格3、mysql的驱动已经修改为com.mysql.cj.jdbc.Driver,英文意思是之前的已...

nyhyn的专栏 5042

SQL注入思路详解

一、SQL注入可以分为三个步骤 1.识别Web应用与数据库交互的可能输入(识别潜在注入点) 2.SQL注入语句测试 3.根据服务器返回判定注入语句是否影响了SQL执行结果以判断是否存在SQL注入 2.识别Web应用与数据库交互的可能输入点 GET请求参数 POST请求参数 Cookie X-Forword-For User-Agent Refer Host ...

Litbai_zhang 971
上一篇: 论前端做校验后服务器端是否还要做校验
下一篇: Eclipse和DOS下运行程序的差异(主要涉及user.dir和classpath的问题)
yklovejava
博客等级 码龄14年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值