JNDI学习笔记

news2024/11/18 7:45:36

最近在研究JNDI注入漏洞,就先浅浅的学习以下JNDI相关知识。

JNDI对各种目录服务的实现进行抽象和统一化。

在 Java 应用中除了以常规方式使用名称服务(比如使用 DNS 解析域名),另一个常见的用法是使用目录服务作为对象存储的系统,即用目录服务来存储和获取 Java 对象。

比如对于打印机服务,我们可以通过在目录服务中查找打印机,并获得一个打印机对象,基于这个 Java 对象进行实际的打印操作。

为此,就有了 JNDI,即 Java 的名称与目录服务接口,应用通过该接口与具体的目录服务进行交互。从设计上,JNDI 独立于具体的目录服务实现,因此可以针对不同的目录服务提供统一的操作接口。JNDI全称是:Java Naming and Directory Interface,它是一类给Java应用程序提供命名(Naming)和目录(Directory)功能的API编程接口。

JNDI 架构上主要包含两个部分,即 Java API和 SPI。

SPI 全称为 Service Provider Interface,即服务供应接口,主要作用是为底层的具体目录服务提供统一接口,从而实现目录服务的可插拔式安装。在 JDK 中包含了下述内置的目录服务:

  1. RMI: Java Remote Method Invocation,Java 远程方法调用;
  2. LDAP: 轻量级目录访问协议;

除此之外,用户还可以在 Java 官网下载其他目录服务实现。由于 SPI 的统一接口,厂商也可以提供自己的私有目录服务实现,用户可无需重复修改代码。

命名服务(Naming Service)

它是一个类似于键值对绑定的功能,可以把一个对象作为值跟命名服务上一个名字绑定在一起,然后就可以通过这个名字到命名服务商查询以及使用先前绑定的对象。

目录服务(Directory Service)

名称服务还算比较好理解,那目录服务又是什么呢?简单来说,目录服务是名称服务的一种拓展,除了名称服务中已有的名称到对象的关联信息外,还允许对象拥有属性(attributes)信息。由此,我们不仅可以根据名称去查找(lookup)对象(并获取其对应属性),还可以根据属性值去搜索(search)对象。

举个例子:以打印机服务为例,我们可以在命名服务中根据打印机名称去获取打印机对象(引用),然后进行打印操作;同时打印机拥有速率、分辨率、颜色等属性,作为目录服务,用户可以根据打印机的分辨率去搜索对应的打印机对象。

目录服务(Directory Service)提供了对目录中对象(directory objects)的属性进行增删改查的操作。

LDAP:轻量级目录访问协议,是一种开放的网络协议,用于访问和维护分布式目录服务。LDAP 提供了一种标准化的方式来查询、添加、修改和删除分布式目录中的数据。

RMI:远程方法调用,是 Java 平台提供的一种机制,用于实现分布式应用程序中的远程通信和方法调用。RMI 允许在不同的 Java 虚拟机(JVM)上运行的对象之间进行通信,并调用对方的方法,就像调用本地对象的方法一样。

总而言之,目录服务也是一种特殊的名称服务,关键区别是在目录服务中通常使用搜索(search)操作去定位对象,而不是简单的根据名称查找(lookup)去定位。

JNDI带来优点:由于JNDI提供的接口统一性,当需要访问不同类型的目录服务时,不必再像以前一样分别针对不同的服务协议来实现用于访问的客户端,都可以通过JNDI提供的同一接口访问。

通过JNDI访问Java RMI服务:

package Example1;

import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;

public class JndiRmiTest {
    public static void main(String[] args) throws Exception{
        // env是用于创建InitialContext的环境变量属性配置
        Hashtable env = new Hashtable();
        // Context.INITIAL_CONTEXT_FACTORY即字符串java.naming.factory.initial
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");
        // Context.PROVIDER_URL即字符串java.naming.provider.url
        env.put(Context.PROVIDER_URL,"rmi://localhost:1099");
        // 创建 InitialContext
        InitialContext context = new InitialContext(env);
        // 把foo这个名字和sample string绑定在一起
        String name = "foo";
        context.bind(name,"sample string");
        // 根据绑定的名字查询对应绑定的对象
        Object obj = context.lookup(name);
        // 在程序中使用查询获得的对象并且打印出来
        System.out.println(name + "is bound to" + obj);
    }
}

通过JNDI访问LDAP服务:

package Example1;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;

public class JndiLdapTest {
    public static void main(String[] args) throws NamingException {
        // env是用于创建InitialContext的环境变量属性配置
        Hashtable env = new Hashtable();
        // Context.INITIAL_CONTEXT_FACTORY即字符串java.naming.factory.initial
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");
        // Context.PROVIDER_URL即字符串java.naming.provider.url
        env.put(Context.PROVIDER_URL,"ldap://localhost:389");
        // 创建 InitialContext
        InitialContext context = new InitialContext(env);
        // 把 cn=foo,dc=test,dc=org 和 String 对象 sample string绑 定在一起
        String name = "cn=foo,dc=test,dc=org";
        context.bind(name,"sample string");
        Object obj = context.lookup(name);
        System.out.println(name + "is bind to" + obj);
        
    }
}

通过比较可以看出,使用JNDI不管是访问RMI和LDAP服务,执行的代码几乎都是一样的

JNDI中Reference的概念

为了将Java对象绑定到像RMI或者LDAP这些命名目录服务上,可以通过序列化来将特定状态下的对象转换为字节流进行传输和存储。但并不总是可以绑定对象的序列化状态,因为对象可能太大或不符合要求。

处于这样的考虑,JNDI定义了"命名引用"的概念,可以创建一个Reference,把它和要绑定得对象关联到一起,这样就只需要将对象的Reference绑定到目录服务上,而不用绑定原本的对象。Reference中会存有如何构造出关联对象的信息。命名目录服务的客户端在查询到Reference时,会根据Reference里的信息还原得到原本的绑定对象。

也就是说不在管理对象,而是通过管理Reference来管理对象。

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

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

相关文章

SpringBoot --- 基础篇

一、快速上手SpringBoot 1.1、概述 SpringBoot开发团队认为原始的Spring程序初始搭建的时候可能有些繁琐,这个过程是可以简化的,那原始的Spring程序初始搭建过程都包含哪些东西了呢?为什么觉得繁琐呢?最基本的Spring程序至少有一…

大数据:VMware | Ubuntu | Hadoop | Spark | VMwaretools | Python 安装配置总结

一.环境概述 Linux发行版:Ubuntu虚拟机应用:VMware Workstation ProHadoop版本:3.1.3|伪分布式集群JDK版本:JDK1.8.0_162Spark版本:2.4.0Scala版本:2.12.8Python版本:3.6.8 | 3.7.16 二.Ubuntu 2.1 光盘文件 首先进入链接Down…

因为AI,我被裁了;MJ设计海报全流程;独立开发者每周收入2.3K美元;MJ常用参数超详细介绍 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 受 AI 影响,这 8 家公司开始裁员…… 为了搞清楚 AI 最近在影响哪些行业、哪些职业,作者花了三天事件找到了八…

基于SSM的网络在线考试系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 前言…

《Java并发编程实战》课程笔记(二)

可见性、原子性和有序性问题:并发编程 Bug 的源头 源头之一:缓存导致的可见性问题 在单核时代,所有的线程都是在一颗 CPU 上执行,CPU 缓存与内存的数据一致性容易解决。 因为所有线程都是操作同一个 CPU 的缓存,一个…

《面试1v1》ThreadLocal

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 面试官: 你好,请问你对 ThreadLocal 有了解吗? 候选人: 您好,我知道 ThreadLocal 是一个 Java 中的类&a…

【坐标变换】坐标系坐标变换简单推导--未完待续

如图所示,假设已知坐标系 ( X , Y ) (X,Y) (X,Y),旋转后的坐标系为 ( X ′ , Y ′ ) (X,Y) (X′,Y′),旋转角度为 θ \theta θ,假设点p在 ( X , Y ) (X,Y) (X,Y)坐标系下为 ( x , y ) (x,y) (x,y),坐标在旋转后的坐标…

速来!谷歌师兄的LeetCode刷题笔记开源了!

有小伙伴私聊我说刚开始刷LeetCode的时候,感到很吃力,刷题效率很低。我以前刷题的时候也遇到这个问题,直到后来看到这个谷歌师兄总结的刷题笔记,发现LeetCode刷题都是套路呀,掌握这些套路之后,就变得非常简…

kubernetes高可用+harbor高可用

kubernetes高可用harbor高可用 基于kubeadm安装kubernetes高可用集群全部主机环境初始化双主节点部署keepalive双主节点初始化kubeadm在k8smaster1节点上初始化k8s在k8smaster2节点上做扩容操作 harbor高可用集群初始化harbor1节点安装环境在另一台节点上配置使用私有harbor仓库…

初学QT:使用QtDesigner绘制一个简单的界面(Day01)

关于Qt 打算在这里记录我学习qt过程中遇见的问题的收获 今天是学习qt的第一天,首先找了一个界面打算照着这个界面写一个一样的 因为是第一天,所以我用的是qt designer写的 其中遇到的问题: 设置背景图片 首先不能直接添加图片到背景图片中…

如何在华为OD机试中获得满分?Java实现【分界线】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

在 Alma Linux 9 上安装 Node.js 的 3 种不同方法

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,用于构建快速、可扩展的网络应用程序。在 Alma Linux 9 上安装 Node.js 可以为开发者提供强大的工具和库来开发服务器端应用程序。 本文将介绍三种不同的方法来安装 Node.js 在 Alma Linux 9 上。 1. 方法一…

LLMs的自动化工具系统(HuggingGPT、AutoGPT、WebGPT、WebCPM)

在前面两篇博文中已经粗略介绍了增强语言模型和Tool Learning,本篇文章看四篇代表性的自动化框架,HuggingGPT、AutoGPT、WebGPT、WebCPM。 Augmented Language Models(增强语言模型)Toolformer and Tool Learning(LLM…

chatgpt赋能python:了解PythonSpace:Python编程中的重要概念

了解Python Space:Python编程中的重要概念 Python Space是Python编程的一个关键概念,可以帮助你更好地理解Python中的命名空间和作用域。在这篇文章中,我们将深入探讨Python Space,介绍命名空间的概念,讨论命名空间和…

支付系统设计四:支付核心设计03-快捷发送短信(失败转代扣)

文章目录 前言一、背景1. 应用架构2. 分层支撑机制 二、银行卡快捷支付1. 用户操作流程2. 系统执行流程--正常2.1 发送短信2.2 短信确认 3. 系统执行流程--异常3.1 异常环节3.1.1 路由失败3.1.2 调用支付渠道失败 3.2 异常处理3.2.1 路由失败3.2.2 调用支付渠道失败 4. 流程解析…

指导实验心得5篇实用技巧

指导实验心得1 我觉得化工原理实验是一门验证性课程,它把我们在化工原理学到的各种单元操作化为实实在在的东西,而让我们把学到的知识认识到它的实在性。流体输送——离心泵、过滤——板框压滤机、对流传热——套管式换热器、吸收蒸馏——填料塔板式塔、…

AF594 NHS,Alexa Fluor594 NHS Ester,AF 594 NHS 活化酯,用于成像和流式细胞术中的稳定信号生成

【产品描述】 陕西新研博美生物科技有限公司供应的​Alexa Fluor594是一种鲜红色染料。Alexa Fluor用于成像和流式细胞术中的稳定信号生成 594染料是水溶性的,并且从pH 4到pH 10对pH不敏感。Alexa Fluor 594染料与多种抗体、肽、蛋白质、示踪剂和扩增底物偶联&#…

java内存问题

各种OOM的情况 1. 堆溢出-java.lang.OutOfMemoryError: Java heap space。 2. 栈溢出-java.lang.OutOfMemorryError。 3. 栈溢出-java.lang.StackOverFlowError。 4. 元信息溢出-java.lang.OutOfMemoryError: Metaspace。 5. 直接内存溢出-java.lang.OutOfMemoryError: Direct …

软件开发工程师个人简历模板3篇

软件开发工程师个人简历模板篇1 姓 名: 张先生 性 别: 男 婚姻状况: 未婚 民 族: 汉族 户 籍: 广东-珠海 年 龄: 28 现所在地: 广东-珠海 身 高: 168cm 希望地区: …

Toolformer and Tool Learning(LLMs如何使用工具)

大模型的能力让学术和工业界都对通用人工智能的未来充满幻想,在前一篇博文中已经粗略介绍, Augmented Language Models(增强语言模型) ALM的两大思路是推理和工具,本篇博文整理两篇关于Toolformer或Tool Learning的论…