【再探】Java—Java 沙箱机制与类加载器

 沙箱(Sandbox)机制是将Java程序限定在JVM特定的运行范围内,并严格限制代码对本地系统资源的访问,以保证代码的有效隔离,防止对本地系统造成破坏。

1 安全模型

类在加载过程中,类加载器会为类设置初始的安全上下文(从安全策略文件读取权限配置信息),在类的执行过程中,会根据它所拥有的权限进行检查和授权。

安全管理器

SecurityManager是Java的一个组件。用于控制应用程序对系统资源的访问。

代码源

CodeSource,是确定一个特定代码源的原点,有两个字断,一个是代码路径URL(可以是包的位置,也可以是jar的位置),另一个是数字签名证书信息。

权限

Permission,用于授予或拒绝访问特定资源的权限。PermissionCollection类是一组Permission对象的集合。

这两个类都有implies(Permission)方法,用于检测是否拥有该权限。

策略

Policy,实现基于规则的访问控制和权限管理。定义了一组规则,用于确定哪些主体可以访问哪些对象。

保护域

ProtectionDomain,包含了代码源、权限集信息。Java中,每个类都会分配到一个保护域中。保护域会在类加载阶段进行设置。

图 安全模型中的几个重要概念

图 Java的安全模型

1.1 类加载过程中的授权及权限检测

  1. 当JVM需要使用一个类时,会委托给类加载器去加载这个类,来加载类的字节码,并将其转换为JVM可以理解的Class对象。
  2. 加载类时,类加载器会为这个类创建一个保护域(一个类只能在一个保护域中)。
  3. 权限集可以在类加载时静态设置,也可以在运行时动态修改。权限信息通常来自Java安全策略文件。此外还可以通过安全管理器的API在运行时动态授予和撤销权限。
  4. Java代码尝试执行受保护的操作(文件访问、网络访问、反射等)时,安全管理器会检察该代码相关联的保护域中的权限,如果没权限,则会抛出SecurityException异常。

1.2 安全策略文件

用于配置代码的执行权限。 可以使用-Djava.security.manager 命令行来指定Java安全策略文件。根据作用范围,分为全局策略及用户策略。

全局策略

作用整个Java虚拟机的安全策略,用于定于默认的安全规则。对所有Java应用程序生效。通常位于$JAVA_HOME/jre/lib/security/java.policy。

用户策略

是个可选的安全策略,用于定义应用程序的安全规则。

表 全局策略与用户策略

Java安全权限验证默认没开启,可以通过-Djava.security.manager来开启。但是可能会带来下面这些影响。

性能下降

JVM需要对每个可执行的代码进行安全性检查,从而可能会导致性能下降。

功能限制

功能可能会受到限制。如果没有配置良好的安全策略文件或者安全策略过于严格,则可能导致程序无法执行一些关键操作,例如访问本地文件系统,创建网络连接等。

需要额外的配置

需要编写和配置安全策略文件,要求程序员具有一定的安全意识和技能。

表 开启安全权限验证的影响

2 类加载器

每个类加载器都有自己的命名空间,这意味着由特定类加载器加载的类与其他类加载器加载的类在逻辑上是隔离的(除非这些加载器有明确的父子关系)。

类隔离

每个类加载器都有自己的命名空间,不同类加载器加载的同名类被视为不同的类。所以允许应用程序定义与标准库或第三方库同名的类,而不会发生冲突。

资源隔离

与类隔离同理。

安全性

会在加载过程中对类进行权限配置与验证。

表 类加载器的其他作用

2.1 自定义类加载器。

图 Java默认的三种加载器及协作关系

Java中加载类是用了“双亲委派模型”,即加载类时,先委托给父类加载器,如果父类加载器加载不了,则再自己处理。这里的父类并不是指具有继承关系的,而是通过合成复用,来设置父类加载器。

系统默认使用应用程序类加载器来加载类。(实际上还有许多的加载方式,例如通过远程加载等)

我们在自定义类加载器时,如果没有指定父类加载器,那么其父类加载器为应用程序类加载器。

public class CustomClassLoader extends ClassLoader{public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {ClassLoader classLoader = new CustomClassLoader();Class<?> aClass = classLoader.loadClass("com.huangmingfu.ReadFileObj");System.out.println(aClass.newInstance());}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] classByte = getClassByte(name);return defineClass(name.substring(0,name.lastIndexOf(".")),classByte,0,classByte.length);}private byte[] getClassByte(String name) {String filePath = getPath() + "/" + name;try(FileInputStream inputStream = new FileInputStream(filePath);) {ByteArrayOutputStream stream = new ByteArrayOutputStream();int i = 0;while ((i=inputStream.read()) != -1) {stream.write(i);}return stream.toByteArray();} catch (IOException e) {throw new RuntimeException(e);}}private static String getPath(){URL url = ClassLoader.class.getProtectionDomain().getCodeSource().getLocation();try {return URLDecoder.decode(url.getPath(),"UTF-8");} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}}
}

2.1.1 sql驱动中的类加载器

Java 核心库(rt.jar)中包含了与数据库连接有关的接口。实际实现则需要数据库厂家自己提供的jar包(例如,mysql的mysql-connector-java)。通过SPI模式,当厂家的数据库驱动包包含到用户路径时,rt.jar的ServiceLoader 会去加载这个实现类,现在问题来了:

核心库是启动类加载器加载的,而厂家提供的jar包不能被其加载。在ServiceLoader 中,通过Thread.currentThread().getContextClassLoader(); 来获取上下文类加载器来加载厂家的实现类。

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

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

相关文章

gstreamer+mpp调用硬解码播放视频

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、cpu解码二、gstreamermpp1.默认已安装2.没安装必要软件 总结 前言 以前一直在MPP上开发硬解码推理&#xff0c;最近想弄一个盒子支持调用mpp硬解码播放视频…

跑图像生成模型GAN时,遇到OSError: cannot open resource 报错解决办法

报错信息如下&#xff1a; Traceback (most recent call last): File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py", line 276, in <module> count train(dataloader, image_encoder, text_encoder, File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py…

QT Creator与QT的下载安装

0.起因/小结&#xff1a; 因为运行项目需要更高版本的QT。 下载了QT 6.2.0&#xff0c;但是里面的gcc&#xff0c;g&#xff0c;gdb是64bit的&#xff0c;而我的QT Creator是32bit的&#xff0c;所以又下载了QT 13.0.0的64bit版本。 遇到问题&#xff1a;msvcp140_1.dll找不到…

软件管理及部分命令

sed命令 格式&#xff1a; sed [选项] 操作 目标文件 选项&#xff1a; -i&#xff1a;修改原始文件【如果不加-i&#xff0c;那就是仅仅修改内存中的文件副本】 案例&#xff1a;将1.txt中的tom修改成jerry。 sed -i "s/tom/jerry/g" 1.txt 将1…

基于FPGA的任意点滑动平均(滑动窗长度和数据位宽参数化,例化时参数可设置)

目录 1.前言2.原理3.举例说明4.Matlab实现5.FPGA实现滑动平均 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 对于一维信号&#xff0c;我们可以使用类似移动平均滤波&#xff08;Moving Average Filtering&#xff09;实现denoising。Moving Average Filtering 是一种…

Jmeter性能分析及调优详解(入门)

一、系统性能理解 如果说需求、开发、DB、运维、测试是单一一门学科&#xff0c;那么性能就是综合学科&#xff0c;它包含了需求分析、DB、开发、测试、运维的所有学科。其实一般来说在实际性能分析和调优中&#xff0c;测试担任的角色就是写压测脚本并执行脚本查看结果&#…

TPM 是什么?如何查看电脑的 TPM?

TPM 是什么&#xff1f; 首先我们来了解一下 TPM 是什么&#xff0c;TPM 由可信计算组织&#xff08;Trusted Computing Group&#xff0c;TCG&#xff09;开发&#xff0c;为了在提高计算机系统的安全性。随着网络安全威胁的不断增加&#xff0c;TPM 技术逐渐成为确保系统安全…

开源网关Apache APISIX启用JWT身份验证

说明&#xff1a; 本文APISIX的配置参考我之前写的《Ubuntu部署Apache APISIX》 创建最小API 首先&#xff0c;确保你已经安装了.NET 6 SDK。创建文件夹“MinimalApiDemo”&#xff0c;VS Code打开文件夹&#xff0c;打开终端 dotnet new web -o MinimalApiDemo cd Minimal…

49.线程池的关闭方法

shutdown方法 1.线程池状态变为shutdown 2.不会接收新任务 3.已提交的任务会执行完 4.此方法不会阻塞调用线程执行 ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.submit(() -> {log.debug("task1 running");try {TimeUnit…

ArrayList——简单洗牌算法

特殊语法介绍&#xff1a; List<List<E>> 该语法情况比较特殊&#xff0c;相当于一个“二维数组”存着一个个线性表的结构&#xff0c;如图&#xff1a; 该语法的灵活性强&#xff0c;可适用于多种类型和多种情况。接下来就使用该语法来实现一个简单的洗牌操作。…

vite+ts设置别名

准备工作 安装 types/node 避免代码爆红 npm install types/node一、根目录下 vite.config.ts 文件中配置 import { resolve } from path;resolve: {// 设置文件./src路径为 alias: [{find: ,replacement: resolve(__dirname, ./src)}] }二、根目录下 tsconfig.json 文件中配…

【漏洞复现】用友NC downCourseWare 任意文件读取漏洞

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC …

618网购节,电商能挡住恶意网络爬虫的攻击吗?

目录 爬虫盗取电商数据的步骤 电商平台如何发现网络爬虫&#xff1f; 如何拦截违法网络爬虫 2023年&#xff0c;杭州中院审结了两起涉及“搬店软件”的不正当竞争案件。本案的原告是国内某大型知名电子商务平台的运营主体&#xff0c;而被告则是开发了一款名为“某搬家快速商品…

汽车分销商文件流转优化:实现稳定高效的文件分发处理

在汽车圈里&#xff0c;分销商可是个不可或缺的角色。他们既要跟汽车厂家紧紧绑在一起&#xff0c;还得跟下游的销售渠道或者直接跟消费者打成一片&#xff0c;文件来回传递那是家常便饭。 这文件发放的速度快不快&#xff0c;安不安全&#xff0c;直接影响到分销商做事的效率…

安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑

安徽京准NTP时钟系统&#xff1a;GPS北斗卫星授时下的生活重塑 安徽京准NTP时钟系统&#xff1a;GPS北斗卫星授时下的生活重塑 时间的流逝自古以来时钟都是人类生活与活动的基础。然而&#xff0c;随着科技的进步&#xff0c;我们对时间管理和测量的方法已经发生了翻天覆地的变…

有哪些可以替代postman的接口测试软件?

替代Postman的接口测试软件有很多选择&#xff0c;其中一些流行的工具包括Insomnia、SoapUI、JMeter、Paw等。在本篇文章中&#xff0c;我将从0到1&#xff0c;详细介绍这些接口测试软件的使用方法和规范&#xff0c;帮助你选择适合的工具进行接口测试。 1. Insomnia Insomni…

手机怎么压缩视频?归纳了三种快速压缩方案

手机怎么压缩视频&#xff1f;在数字时代&#xff0c;手机已经成为我们记录生活的重要工具&#xff0c;而视频作为其中的一种主要形式&#xff0c;更是占据了极大的存储空间。然而&#xff0c;随着手机拍摄的视频越来越多&#xff0c;如何高效压缩视频以节省存储空间&#xff0…

⌈ 传知代码 ⌋ AI驱动食物图像识别

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

Selenium时间等待_显示等待

特点&#xff1a; 针对具体元素进行时间等待 可以自定义等待时长和间隔时间 按照设定的时间&#xff0c;不断定位元素&#xff0c;定位到了直接执行下一步操作 如在设定时间内没定位到元素&#xff0c;则报错&#xff08;TimeOutException&#xff09; 显示等待概念&#x…

mysql的binlog占用大量磁盘空间的解决方法

查看当前日志保存天数&#xff1a; mysql> show variables like %expire_logs_days%; ------------------------- | Variable_name | Value | ------------------------- | expire_logs_days | 0 | ------------------------- 1 row in set (0.08 sec) 默认是0&…