2.JNDI

合集下载

JavaJNDI案例详解

JavaJNDI案例详解

JavaJNDI案例详解JNDI的理解JNDI是 Java 命名与⽂件夹接⼝(Java Naming and Directory Interface),在J2EE规范中是重要的规范之中的⼀个,不少专家觉得,没有透彻理解JNDI的意义和作⽤,就没有真正掌握J2EE特别是EJB的知识。

那么,JNDI究竟起什么作⽤?//带着问题看⽂章是最有效的要了解JNDI的作⽤,我们能够从“假设不⽤JNDI我们如何做?⽤了JNDI后我们⼜将如何做?”这个问题来探讨。

没有JNDI的做法:程序猿开发时,知道要开发訪问MySQL数据库的应⽤,于是将⼀个对 MySQL JDBC 驱动程序类的引⽤进⾏了编码,并通过使⽤适当的 JDBC URL 连接到数据库。

就像以下代码这样:Connection conn=null;try {Class.forName("com.mysql.jdbc.Driver",true, Thread.currentThread().getContextClassLoader());conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");......conn.close();} catch(Exception e) {e.printStackTrace();} finally {if(conn!=null) {try {conn.close();} catch(SQLException e) {}}}这是传统的做法,也是曾经⾮Java程序猿(如Delphi、VB等)常见的做法。

这种做法⼀般在⼩规模的开发过程中不会产⽣问题,仅仅要程序猿熟悉Java语⾔、了解JDBC技术和MySQL,能够⾮常快开发出对应的应⽤程序。

没有JNDI的做法存在的问题:1. 数据库server名称MyDBServer 、username和⼝令都可能须要改变,由此引发JDBC URL须要改动;2. 数据库可能改⽤别的产品,如改⽤DB2或者Oracle,引发JDBC驱动程序包和类名须要改动;3. 随着实际使⽤终端的添加,原配置的连接池參数可能须要调整;4. ......解决的⽅法:程序猿应该不须要关⼼“详细的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?訪问数据库的username 和⼝令是什么?”等等这些问题。

jndi原理

jndi原理

jndi原理一、什么是jndiJava命名和目录接口(Java Naming and Directory Interface,简称JNDI)是Java平台提供的一个用于访问命名和目录服务的API。

它允许Java应用程序通过统一的方式访问不同的命名和目录服务,如DNS、LDAP、NIS等。

JNDI提供了一种标准化的方式来管理和查找Java对象,使得开发者可以轻松地将不同类型的资源绑定到Java命名空间中,并通过命名的方式进行访问和管理。

二、JNDI的使用场景JNDI主要用于以下几个方面:1.连接数据库:通过JNDI可以将数据库连接池配置为一个资源,然后通过命名的方式在应用程序中访问数据库连接池,从而降低了应用程序与特定数据库连接池的耦合性,使得数据库的切换更加方便。

2.连接消息队列:JNDI可以将消息队列配置为一个资源,应用程序可以通过命名的方式访问消息队列,从而发送和接收消息。

3.访问企业级资源:在企业级开发中,往往需要访问多个不同的资源,如EJB、JMS、JDBC等。

通过将这些资源配置为JNDI资源,可以通过统一的方式在应用程序中访问这些资源。

4.配置中心:在分布式系统中,经常需要集中管理各个子系统的配置信息。

通过使用JNDI,可以将配置信息存储为JNDI资源,然后在各个子系统中通过命名的方式访问配置信息。

三、JNDI的工作原理JNDI的工作原理可以分为以下几个步骤:1.创建一个初始上下文(Initial Context):应用程序通过调用JNDI提供的API创建一个初始上下文,用于获取其他JNDI资源的入口。

初始上下文是整个JNDI操作的起点。

2.查找JNDI资源:通过初始上下文,应用程序可以通过命名的方式查找指定的JNDI资源。

JNDI提供了一套命名规范,用于标识不同类型的资源。

应用程序可以通过这些命名规范指定要查找的资源。

3.绑定和解绑JNDI资源:应用程序可以将一个Java对象绑定到JNDI上下文中,使得其他应用程序可以通过命名的方式访问该对象。

JNDI 详解

JNDI 详解

JNDI全面总结原理:在DataSource中事先建立多个数据库连接,保存在数据库连接池中。

当程序访问数据库时,只用从连接池中取空闲状态的数据库连接即可,访问结束,销毁资源,数据库连接重新回到连接池,这与每次去直接访问数据库相比,会节省大量时间和资源。

JNDI( Java Naming and Directory Interface ),是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。

如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。

这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。

JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。

很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。

可以把它理解为一种将对象和名字捆绑的技术,对象工厂负责生产出对象,这些对象都和唯一的名字绑在一起,外部资源可以通过名字获得某对象的引用。

在javax.naming的包包中提供Context接口,提供了两个很好用的方法:<1> void bind( String name , Object object )将名称绑定到对象。

所有中间上下文和目标上下文(由该名称最终原子组件以外的其他所有组件指定)都必须已经存在。

<2>Object lookup( String name )检索指定的对象。

如果name为空,则返回此上下文的一个新实例(该实例表示与此上下文相同的命名上下文,但其环境可以独立地进行修改,而且可以并发访问)。

运行机制:1、首先程序代码获取初始化的JNDI 环境并且调用Context.lookup() 方法从JNDI 服务提供者那里获一个DataSource 对象2、中间层JNDI 服务提供者返回一个DataSource 对象给当前的Java 应用程序这个DataSource 对象代表了中间层服务上现存的缓冲数据源3、应用程序调用DataSource 对象的getConnection() 方法4、当DataSource 对象的getConnection() 方法被调用时,中间层服务器将查询数据库连接缓冲池中有没有PooledConnection 接口的实例对象。

JNDI技术总结精品PPT课件

JNDI技术总结精品PPT课件
6
JNDI原理
将对象和名字捆绑的技术,对象工厂负责生产出对象,这些对象 都和唯一的名字绑在一起,外部资源可以通过名字获得某对象的引用。
7
JNDI架构
JNDI架构的理解
• JNDI的架构与JDBC的架构非常类似.JNDI架构提 供了一组标准命名系统的API。在应用程序中,我 们实际上只使到用以上几个包的中类.具体调用类 及通信过程对用户来说是透明的. JNDI API提供了 访问不同JNDI服务的一个标准的统一的实现,其具 体实现可由不同的 Service Provider来完成。
12
用来解决什么问题
1、数据共享
命名或目录服务使读者可以集中存储共有信息,这一点在网络应用中 是非常重要的,因为这使得这样的应用更协调、更容易管理。例如,可以将 打印机设置存储在目录服务中,以便被与打印机有关的应用使用。
2、分布式应用
jndi诞生的理由似乎很简单。随着分布式应用的发展,远程访问对象 访问成为常用的方法。虽然说通过Socket等编程手段仍然可实现远程通信, 但按照模式的理论来说,仍是有其局限性的。RMI技术,RMI-IIOP技术的产 生,使远程对象的查找成为了技术焦点。JNDI技术就应运而生。JNDI技术产 生后可方便查找远程和本地对象。
进行SQL操作
14
*/ ...... conn.close();} catch(Exception e) { e.printStackTrace();} finally { if(conn!=null) { try { conn.close(); } catch(SQLException e) {} }}
• jndi诞生的理由似乎很简单。随着分布式应用的发展,远 程访问对象访问成为常用的方法。虽然说通过Socket等编 程手段仍然可实现远程通信,但按照模式的理论来说,仍 是有其局限性的。RMI技术,RMI-IIOP技术的产生,使远程 对象的查找成为了技术焦点。JNDI技术就应运而生。JNDI 技术产生后,就可方便的查找远程或是本地对象。

JNDI教程

JNDI教程

JBOSS环境下JNDI树的命名约定: (1)java:copm 这个上下文环境和其子上下文环境仅能被与之相关 的特定应用组件访问和使用 (2)java: 子上下文环境和绑定的对象只能被Jboss服务器虚拟 机内的应用访问 (3)其他上下文环境 只要实现序列化就可以被远程用户调用。
J2EE环境下,JNDI的主要用途:
• 使用JNDI获得对JAVA事务API中的 UserTransaction接口的引用 • 借助于JNDI,连接到资源工厂,比如JDBC、 JMS等。 • 在EJB组件中,借助于JNDI查找其他的EJB组件。
3、JNDI架构 JNDI由两部分组成:客户API和服务提供商接口(SPI)。客户API是 程序通过客户API提供的接口,实现对命名服务和目录服务的操作, 比如注册一个命名、查询、删除、生成一个命名管理结构等。 服务提供商接口是用于构建JNDI实现的框架。借助于SPI,能够动态 插入命名和目录服务提供商的产品。
命名系统,构成命名空间定义的语法语义。 命名空间,根据命名系统的语法约定由原子名、 复合原子名、上下文构成的结构,比如文件系统 的命名空间由文件名和目录组成。 合成名,是跨越了多个命名系统的名字。比如WEB 站点中的URL,比如HTTP: ///PRODUCT/EJB/INDEX.HTML,其中 HTTP来自URL secheme-id命名空间。 ,来自于DNS命名空间 PRODUCT、EJB、INDEX.HTML来自于WEB服务器文件 系统的命名空间。
JNDI
JNDI编程: (1)JNDI类 javax.naming.Context(interface) 其中INITIAL_CONTEXT_FACTORY 和PROVIDER_URL 。 javax.naming.Naming(interface)

jndiexploit用法

jndiexploit用法

jndiexploit用法JNDIExploit用法简介JNDIExploit是一种利用Java命名和目录接口(Java Naming and Directory Interface)漏洞的工具。

它可以帮助攻击者利用这些漏洞来执行远程代码,导致服务器的远程命令执行或拒绝服务攻击。

JNDI是Java中用于访问命名和目录服务的API。

它允许Java应用程序通过命名和目录服务查找和访问各种资源,如数据库连接、消息队列、网络服务等。

然而,由于JNDI的设计缺陷,攻击者可以构造恶意输入,导致服务器执行任意代码。

JNDIExploit利用这些漏洞的原理是通过构造恶意的JNDI引用,使得服务器在查询和加载资源时,会尝试执行恶意代码或连接到攻击者控制的恶意服务。

这种攻击通常利用了JNDI的远程资源加载功能。

为了成功利用JNDIExploit,攻击者需要了解目标服务器上正在使用的JNDI资源,并构造相应的恶意JNDI引用。

攻击者可以使用不同的技术和工具来获取目标服务器上的JNDI资源信息,如查看配置文件、使用漏洞扫描器等。

一旦攻击者成功构造了恶意JNDI引用,他们可以将其发送到目标服务器,并等待服务器查询和加载该资源。

当服务器尝试加载恶意JNDI引用时,攻击者控制的恶意服务或恶意代码将被执行,从而实现远程命令执行或拒绝服务攻击。

为了保护服务器免受JNDIExploit攻击,管理员可以采取以下措施:1. 及时更新和修补软件:及时应用相关安全补丁,以修复已知的JNDI漏洞和其他安全问题。

2. 最小化JNDI资源的使用:只使用必要的JNDI资源,并限制其访问权限。

3. 审查代码和配置文件:审查服务器代码和配置文件,确保没有明显的安全漏洞和不安全的JNDI引用。

4. 网络隔离和访问控制:使用防火墙和访问控制策略来限制对JNDI服务的访问,并阻止来自未信任来源的恶意请求。

总之,JNDIExploit是一种利用Java命名和目录接口漏洞的工具,攻击者可以通过构造恶意的JNDI引用来执行远程代码。

J2EE应用开发——02-2JNDI

J2EE应用开发——02-2JNDI

JNDI基本操作
绑定与查找
查找对象:Context.lookup(String name)方法返回当前上下文中
参数name对应的绑定对象。
ctx=new InitialContext(); Object object=ctx.lookup(“date”);
JNDI实例
JDNI实例
import javax.naming.*; //Context, InitialContext import java.util.*; //Hashtable, Properties public class JNDIDemo { …… …… }
ctx.destroySubcontext(“new”);
JNDI基本操作
绑定与查找
绑定对象:绑定在javax.naming包中有一个专门的类Binding,
此类中有4个方法,但是在实际的开发中,对象和名字的绑定
是通过调用Context接口中的bind()和rebind()方法来实现的。
Context.bind(String name,Object object);
了解JNDI
JNDI概述
JNDI架构图
了解JNDI
JNDI概述
在JDK1.3中,已经包含了JNDI,它分成五个包。每个包提供 的功能:
javax.naming,包含访问命名服务的类和接口定义。 javax.naming.directory,包含访问目录服务的类和接口定义。 javax.naming.ldap,为ldapv3提供的扩展操作提供支持。 javax.naming.event,为访问命名和目录服务时的事件通知提供支 持。 javax.naming.spi,为服务提供商提供的接口,一般用户不会涉及。

jndi 注入原理 -回复

jndi 注入原理 -回复

jndi 注入原理-回复JNDI(Java命名和目录接口)注入是一种常见的攻击技术,该技术通过恶意利用JNDI服务接口的漏洞来注入恶意代码。

在本文中,我们将一步一步地回答关于JNDI注入原理的问题。

1. 什么是JNDI注入?JNDI是Java的一个API,它提供了一种访问和管理命名和目录服务的机制。

JNDI允许Java应用程序在运行时动态查找和访问远程资源,如数据库连接、邮件服务器、网站等。

然而,由于JNDI的设计缺陷,黑客可以通过构造恶意输入来注入恶意代码。

2. JNDI注入的原理是什么?JNDI注入的原理是利用了JNDI Name解析的机制。

当应用程序需要访问一个资源时,它会使用一个JNDI Name来指示需要查找哪个资源。

攻击者可以构造一个恶意的JNDI Name,使应用程序误导到攻击者控制的资源上。

3. JNDI注入的攻击场景是什么样的?JNDI注入主要发生在以下两种场景中:- Web应用程序中的数据库连接:常见的攻击是通过JNDI Name注入一个恶意的数据库连接,使应用程序连接到攻击者控制的数据库,进而执行恶意代码。

- Java命令行程序:攻击者可以通过构建一个恶意的JNDI Name,来让Java命令行程序误导到攻击者的资源上。

4. 如何构造恶意的JNDI Name?攻击者可以通过以下几种方式构造恶意的JNDI Name:- LDAP URL:攻击者可以构造一个LDAP URL,将JNDI Name指向一个LDAP服务器。

这样,当应用程序试图解析这个JNDI Name时,它将从攻击者控制的LDAP服务器中获取资源。

- RMI URL:攻击者可以构造一个RMI URL,将JNDI Name指向一个RMI服务器。

这样,当应用程序试图解析这个JNDI Name时,它将从攻击者控制的RMI服务器中获取资源。

- URL Context:攻击者可以使用JNDI提供的URL Context功能,将JNDI Name指向一个URL。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JDBC/JNDIn JDBC为java应用程序访问不同数据库提供了通用的编程接口。

n它的编程组成部分有三个:n java程序,JDBC API,JDBC驱动程序。

n通过JDBC,开发人员可以方便的将SQL 语句传送给几乎所有数据库。

不必过多的考虑平台的差异性。

n JDBC的驱动程序有四种类型:n JDBC-ODBC桥。

几乎可以应用到所有的关系型数据库。

是一种最简单但较慢的方式。

n JDBC和ODBC转换影响性能。

n JDBC-NATIVE桥要求在客户端(相对于数据库服务器)安装数据库的本地驱动程序。

通过jdbc-native桥将JDBC请求转换为native请求。

JDBC->NATIVE->厂商的具体实现。

n JDBC-NETWORK桥不使用本地驱动,通过网络协议访问中间服务器,由中间服务器代理请求。

n纯JDBC驱动由JDBC驱动直接访问数据库。

允许从客户机直接调用DBMS服务器。

这样的协议由数据库厂商提供。

例如:MySql的一个四类驱动程序。

1.加载DriverClass.forName(“jdbc.odbc.JdbcOdbcDriver”); Class.forName(“org.gjt.mm.mysql.Driver”); Class.forName(“oracle.jdbc.driver.OracleDriver”);2.DriverManagern是JDBC的管理层,作用于用户和驱动程序之间。

跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。

以及登记,注销驱动程序直接输出日志等。

当执行Class.forName(“oracle.jdbc.driver.OracleDriver”);后,自动在DriverManager对象中登记。

对于同一个数据库,可能存在多个不同的驱动程序。

3. 建立ConnectionConnection conn=DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:orcl”,user,password);//主机:端口:数据库,用户名,密码Connection con=DriverManager.getConnection("jdbc:mysql:// localhost:3306/Example","root","99999999");n如果将要多次执行相似的SQL语句,那么使用准备好的语句可能比每次执行原始查询效率更高。

String sql=“update employees set salary=? where id=?”;PreparedStatement stmt=conn.preparedStatement(sql); statement.setFloat(1,100.00); //对应第一个待//替换值salary statement.setInt(2,56);stmt.execute();n存储过程是保存起来的SQL语句集,可以获取或返回用户提供的参数,可以认为是用SQL语句写的方法或函数,保存在数据库中。

n优点:n预编译存储过程可以快速执行。

n提供了执行普通任务的标准方式。

String storeProc=“CREATE procedureSHOW_ORDER @State CHAR(2)”+“AS ”+ “SELECT * FROM customer c WHEREc.state=@State ; ”;try{Class.forName(“”sun.jdbc.odbc.JdbcOdbcDriver”); Connection con=DriverManager.getConnection(“JDBC:ODBC:Customer”);Statement stmt=con.createStatement();stmt.executeUpdate(storeProc); CallableStatement cs=con.prepareCall(“{call SHOW_ORDER(?)}”);cs.setString(1, “NJ”);ResultSet rs=cs.executeQuery();n BLOB 大量的数据存储为字节n CLOB 大量的字符型数据n ARRAY 将数组作为一列存储n Clob notes=re.getClob(“Notes”); n Array medi=rs.getArray(“MEDI”); n……public class MysqlConn{public static void main(String args[]){String query="SELECT * FROM personal";try{Class.forName("com.mysql.jdbc.Driver");//数据库URL jdbc:<subprotocol>:<数据源名>[;<name>=<value>] Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Example","root","99999999");Statement stmt=con.createStatement();//executeUpdate(), execute()支持多个ResultSet 对象ResultSet rs=stmt.executeQuery(query);while(rs.next()){String name=rs.getString("name");System.out.println(name);}con.close();}catch(Exception e){e.printStackTrace();}}}JDBC事务n事务将一组SQL Update语句做为一个单独的语句处理(ACID)。

1.加载驱动并建立连接2.设置auto-commit模式3.生成Statement对象并执行DDL,DML4.提交工作5.catch代码段try{Class.forName(“jdbc.odbc.JdbcOdbcDriver”); String url=“jdbc:odbc:dbname”;Connection con=DriverManager.getConnection( url, “”, “”);con.setAutoCommit(false);……DDL,DML……mit();}catch(SQLException e){con.rollback();}连接池连接池n打开对数据库的连接是耗费时间的过程。

对于短查询来说,打开连接的时间比检索时间更长。

使用连接池会获得数倍的性能。

n连接池的任务:预先分配连接。

管理可用连接。

分配新的连接。

等候连接可用。

在需要时关闭连接。

n连接池的基本思想就是预先建立一些连接,放置于内存对象中以备使用。

容器管理的连接池和数据源n硬编码用户名和密码的缺点,由于程序中包含用户名和密码,可以通过反编译工具将其获得。

n当连接的数据库名称更改后,需要修改原程序,代码的可移植性问题。

n EJB工作在分布环境系统中,应用组件如何重用其他团体开发的组件,寻找可以利用的资源?例如:n数据源是JDBC2.0以后引入的概念,定义了javax.sql.DataSource接口来描述这个概念。

n DataSource对象就是一个代表数据源实体的对象。

一个数据源就是一个用来存储数据的工具,它可以是复杂的大型企业级数据库,也可以是简单得只有行和列的文件。

数据源可以位于在服务器端,也可以位于客服端。

n应用程序通过一个连接来访问数据源,那么一个DataSource对象就是用于提供连接数据源的工具。

n使用DataSource对象建立和数据库的连接比起使用DriverManager接口更加高效,虽然两者的使用范围都很相似,并且都提供了方法用于建立和数据库的连接,设置连接的最大超时时间,获取流、登录。

但两者之间的区别更加明显。

n和DriverManager不同,一个DataSource对象能够识别和描述它所代表的数据源的属性,而且DataSource对象的工作和JNDI具有密切的关系,DataSource的建立、发布、独立于应用程序的管理都依靠JNDI技术。

n使用数据源有两种方式:n独立使用数据源n通过JNDI使用数据源命名服务n名字和对象绑定在一起n能够提供依据名字查找对象的机制n LDAP,NDS等等命名和目录接口n JNDI命名和目录接口是应用程序设计接口,为开发人员提供查找和访问各种命名和目录服务的通用,统一的格式。

n包含大量命名和目录服务,使用相同的API。

n同时连接到多个命名和目录服务。

n允许把名称和JAVA对象或资源联系在一起。

使用JNDI访问EJB组件。

n使用通用接口访问不同的目录服务n JAVA EE服务器都绑定了JNDI实现。

在SAS上建立数据源1.下载驱动,使服务器加载驱动2.建立连接池n端口号: derby 1527mysql3306n用户名, 密码n数据库名n主机名: localhostn或者是URLjdbc:mysql://localhost:3306/bank1 3.建立数据源,使用Ping检查配置是否正确。

n JDBC API2.0提供数据源接口,可以在JDBC驱动管理器中管理数据源和连接。

DataSource对象提供更好的方式获得连接,并且可以连接不同的数据类型。

Excel,Word,。

难点一:Contextn问题:不想在与协议无关的环境上下文中使用针对特定协议的系统信息。

n解决:使用Context对象封装系统系统数据,避免在应用系统和特定协议之间造成耦合。

n上下文Context,能够包含0个或多个绑定对象的对象。

在命名系统中,它们作为查找对象过程的起点。

InitialContext类是一个初始上下文工厂,要执行任何操作,必须建立一个InitialContext。

它是命名方案的起点。

例如/etc文件夹有两个文件:mtab,exports。

/etc文件夹是一个上下文,含有两个文件的绑定。

难点二:lookupn一个对数据库建立的数据源对象被赋予了一个名称,并被一个树形目录结构所管理。

可以查找它,引用它。

<%@ page import="java.sql.*,javax.sql.*,javax.naming.*"%><%Connection conn=null;String query="select * from bank";try{InitialContext ctx= new InitialContext();DataSource ds= (DataSource)ctx.lookup("jdbc/bank1");conn=ds.getConnection();Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(query);while(rs.next()){String name=rs.getString("name");out.println(name);}conn.close();}catch(Exception ex){ }%>使用文件系统的JNDI服务n下载fscontext.jar和providerutil.jar,加入到IDE的类路径。

相关文档
最新文档