Java Naming and Directory Interface
Java Naming and Directory Interface (JNDI) — Java-прикладний програмний інтерфейс для служб іменування та каталогів. Він дає Java-програмам змогу знаходити дані й ресурси у вигляді Java-об'єктів за їхніми іменами. JNDI не залежить від конкретної реалізації служби й визначає інтерфейс постачальника послуг (SPI), завдяки якому до системи можна підключати різні служби каталогів.[1]
Дані, які знаходять через JNDI, можуть надходити із сервера, звичайного файла або бази даних — це визначає використана реалізація.
Типові застосування JNDI:
- підключення Java-програми до зовнішньої служби каталогів, наприклад адресної бази або LDAP-сервера;
- пошук об'єктів у мережі для Java RMI та Jakarta EE;
- отримання сервлетом конфігураційних даних, наданих вебконтейнером;[2]
- доступ до ресурсів на зразок пулів з'єднань із базами даних, черг повідомлень або поштових сеансів.
SPI дає змогу підтримувати практично будь-яку службу іменування чи каталогів, зокрема LDAP, DNS, NIS, службу імен CORBA і файлову систему.
Sun Microsystems уперше оприлюднила специфікацію JNDI 10 березня 1997 року.[3] Згодом API увійшов до стандартних бібліотек платформи Java.
JNDI впорядковує імена ієрархічно. Ім'ям може бути рядок, наприклад org.wikipedia.ejb.MyBean, або об'єкт, що реалізує інтерфейс javax.naming.Name. Ім'я зв'язують з об'єктом, зберігаючи в службі каталогів сам об'єкт або посилання на нього.
Ключове поняття API — контекст, який визначає простір пошуку об'єкта. Початковий контекст слугує відправною точкою, подібно до кореневого каталогу файлової системи. Найпростіший пошук має такий вигляд:
import javax.naming.Context;
import javax.naming.InitialContext;
Context context = new InitialContext();
MyBean bean = (MyBean) context.lookup("com.example.MyBean");
Параметри реалізації — фабрику початкового контексту, адресу постачальника та, за потреби, облікові дані — задають у властивостях середовища або у файлі jndi.properties.
JNDI підтримує:
- зв'язування об'єкта з іменем;
- загальні запити до каталогу;
- сповіщення про зміни записів;
- розширення LDAP;
- пошук об'єктів за атрибутами.[4]
Можливість JNDI звертатися до віддалених служб стала одним із компонентів вразливості Log4Shell: за певних конфігурацій зловмисно сформовані дані могли спричинити JNDI-пошук на контрольованому нападником сервері та подальше виконання коду. У новіших версіях Java можливості віддаленого завантаження класів істотно обмежено.
- ↑ Java Naming and Directory Interface (JNDI) (англ.). Oracle.
- ↑ JNDI Resources HOW-TO. Apache Tomcat User Guide (англ.). Apache Software Foundation.
- ↑ Sun Microsystems, Inc. Introduces Java Naming and Directory Interface API (англ.). 10 березня 1997. Архів оригіналу за 8 вересня 2004.
- ↑ Search Filters (англ.). Oracle.