java jdbc连接_Java Web安全 || Java基础 JDBC Connection

点击上方“凌天实验室”,“星标或置顶公众号”

漏洞、技术还是其他,我都想第一时间和你分享

4caf4334988ad479c92a3860dacd06d3.png

【历史】已连载更新全部内容:【菜单栏】-【JAVA SEC】

JDBC(Java Database Connectivity)是Java提供对数据库进行连接、操作的标准API。Java自身并不会去实现对数据库的连接、查询、更新等操作而是通过抽象出数据库操作的API接口(JDBC),不同的数据库提供商必须实现JDBC定义的接口从而也就实现了对数据库的一系列操作。

Java通过java.sql.DriverManager来管理所有数据库的驱动注册,所以如果想要建立数据库连接需要先在java.sql.DriverManager中注册对应的驱动类,然后调用getConnection方法才能连接上数据库。

JDBC定义了一个叫java.sql.Driver的接口类负责实现对数据库的连接,所有的数据库驱动包都必须实现这个接口才能够完成数据库的连接操作。java.sql.DriverManager.getConnection(xx)其实就是间接的调用了java.sql.Driver类的connect方法实现数据库连接的。数据库连接成功后会返回一个叫做java.sql.Connection的数据库连接对象,一切对数据库的查询操作都将依赖于这个Connection对象。

JDBC连接数据库的一般步骤:

  1. 注册驱动,Class.forName("数据库驱动的类名")

  2. 获取连接,DriverManager.getConnection(xxx)

JDBC连接数据库示例代码如下:

String CLASS_NAME = "com.mysql.jdbc.Driver";
String URL = "jdbc:mysql://localhost:3306/mysql"
String USERNAME = "root";
String PASSWORD = "root";

Class.forName(CLASS_NAME);// 注册JDBC驱动类
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

ab686aff40e0d17c2a87563f2235e2c4.png

数据库配置信息

传统的Web应用的数据库配置信息一般都是存放在WEB-INF目录下的*.properties*.yml*.xml中的,如果是Spring Boot项目的话一般都会存储在jar包中的src/main/resources/目录下。常见的存储数据库配置信息的文件路径如:WEB-INF/applicationContext.xmlWEB-INF/hibernate.cfg.xmlWEB-INF/jdbc/jdbc.properties,一般情况下使用find命令加关键字可以轻松的找出来,如查找Mysql配置信息: find 路径 -type f |xargs grep "com.mysql.jdbc.Driver"

ab686aff40e0d17c2a87563f2235e2c4.png

为什么需要Class.forName?

很多人不理解为什么第一步必须是Class.forName(CLASS_NAME);// 注册JDBC驱动类,因为他们永远不会跟进驱动包去一探究竟。

实际上这一步是利用了Java反射+类加载机制往DriverManager中注册了驱动包!

bdbd5d74dff2f241fc1790fc2c077a3c.png

Class.forName("com.mysql.jdbc.Driver")实际上会触发类加载,com.mysql.jdbc.Driver类将会被初始化,所以static静态语句块中的代码也将会被执行,所以看似毫无必要的Class.forName其实也是暗藏玄机的。如果反射某个类又不想初始化类方法有两种途径:

  1. 使用Class.forName("xxxx", false, loader)方法,将第二个参数传入false。

  2. ClassLoader.load("xxxx");

ab686aff40e0d17c2a87563f2235e2c4.png

Class.forName可以省去吗?

连接数据库就必须Class.forName(xxx)几乎已经成为了绝大部分人认为的既定事实而不可改变,但是某些人会发现删除Class.forName一样可以连接数据库这又作何解释?

实际上这里又利用了Java的一大特性:Java SPI(Service Provider Interface),因为DriverManager在初始化的时候会调用java.util.ServiceLoader类提供的SPI机制,Java会自动扫描jar包中的META-INF/services目录下的文件,并且还会自动的Class.forName(文件中定义的类),这也就解释了为什么不需要Class.forName也能够成功连接数据库的原因了。

Mysql驱动包示例:

4d834d597971941b1b1f4369b8ffffc4.png

ab686aff40e0d17c2a87563f2235e2c4.png

JDBC数据库连接总结

使用JDBC连接数据相对于PHP直接使用mysql_connect/mysqli_connect函数就可以完成数据库连接来说的确难了很多,但是其中也暗藏了很多Java的特性需要我们去深入理解。

或许您会有所疑问我们为什么非要搞明白Class.forName这个问题?这个问题和Java安全有必然的联系吗?其实这里只是想让大家明白Java反射类加载机制、和SPI机制以及养成阅读JDK或者第三方库代码的习惯,也希望不明白上述机制的朋友深入去理解思考下。

学习完本节后希望您能去思考如下问题:

  1. SPI机制是否有安全性问题?

  2. Java反射有哪些安全问题?

  3. Java类加载机制是什么?

  4. 数据库连接时密码安全问题?

  5. 使用JDBC如何写一个通用的数据库密码爆破模块?

**如果您在阅读文章的时候发现任何问题都可以通过Vchat与我们联系,也欢迎大家加入javasec微信群一起交流。

Vchat获取方式:对话框发送“javasec”

20e2260a8a7e58c4534db7b8a1556a39.png 8e9b84edcce62b3111d99c0c94b2b98f.png凌天实验室

凌天实验室,是安百科技旗下针对应用安全领域进行攻防研究的专业技术团队,其核心成员来自原乌云创始团队及社区知名白帽子,团队专业性强、技术层次高且富有实战经验。实验室成立于2016年,发展至今团队成员已达35人,在应用安全领域深耕不辍,向网络安全行业顶尖水平攻防技术团队的方向夯实迈进。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值