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

news2024/10/7 4:29:12

 沙箱(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());
    }

    @Override
    protected 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.coloradmin.cn/o/1796049.html

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

相关文章

【Java毕业设计】基于JavaWeb的在线购物网站的设计与实现

文章目录 摘 要ABSTRACT目 录1 概述1.1 研究背景及意义1.2 国内外研究现状1.3 拟研究内容1.4 系统开发技术1.4.1 vue技术1.4.2 B/S结构1.4.3 Spring Boot框架1.4.4 MySQL数据库1.4.5 MVC模式 2 系统需求分析2.1 可行性分析2.2 功能需求分析 3 系统设计3.1 功能结构设计3.2 系统…

美国签证办理需要带哪些材料?

在申请美国签证时&#xff0c;准备充分的材料至关重要。以下知识人网整理的关于您可能需要携带的一些常见材料&#xff1a; 1.护照&#xff1a;您的护照必须是有效的&#xff0c;并且在签证申请过程中至少有六个月的有效期。 2.签证申请表&#xff1a;您需要填写并提交签证申请…

联合(union)和枚举(enum)学习(c语言)

前言 Hello,亲爱的小伙伴们&#xff0c;好久不见&#xff0c;今天我们继续来学习新的内容-----联合和枚举 如果喜欢作者菌的文章的话&#xff0c;就不要吝啬手中的三连呀&#xff0c;万分感谢&#xff01;&#xff01; 联合&#xff08;共用体&#xff09;&#xff08;union&…

前端开发之性能优化

本文章 对各大学习技术论坛知识点&#xff0c;进行总结、归纳自用学习&#xff0c;共勉&#x1f64f; 文章目录 1. [CDN](https://www.bootcdn.cn/)2.懒加载3.缓存4.图片压缩5.图片分割6.sprite7.Code Splitting8.gzip9.GPU加速10.Ajax11.Tree Shaking12.Resource Hints 1. CD…

VisualStudio 2022 安装net8sdk后无法创建net8项目

目录 一级目录原因分析解决办法 一级目录 VisualStudio 2022 安装net8sdk后无法创建net8项目 原因分析 解决办法 安装net8 查看安装的版本 dotnet --list-sdks升级VisualStudio 2022版本&#xff0c;重启电脑 当前版本 开始升级 升级后版本 已可以使用net8.0

盲盒一番赏小程序:开发探索之旅,打造独特互动体验

在快节奏的现代生活中&#xff0c;每个人都期待一份突如其来的惊喜。为了满足这一需求&#xff0c;我们倾力打造了“盲盒一番赏”小程序&#xff0c;为你带来全新的购物体验&#xff0c;让每一次点击都成为一次心跳加速的探险之旅。 一、盲盒文化&#xff0c;点燃惊喜火花 盲…

苹果不会在WWDC 2024中推出任何搭载M4芯片的Mac电脑

虽然苹果公司已在上月推出了首搭 M4 芯片的 iPad Pro&#xff0c;不过彭博社的马克・古尔曼在最近的实时通讯中透露苹果公司不会在即将进行的 WWDC 2024 开发者大会中推出任何搭载 M4 芯片的 Mac 电脑&#xff08;不会推出任何硬件产品&#xff09;。 此前报道&#xff0c;苹果…

Android 蓝牙概述

一、什么是蓝牙 蓝牙是一种短距离&#xff08;一般10m内&#xff09;无线通信技术。蓝牙技术允许固定和移动设备在不需要电缆的情况下进行通信和数据传输。 “蓝牙”这名称来自10世纪的丹麦国王哈拉尔德(Harald Gormsson)的外号。出身海盗家庭的哈拉尔德统一了北欧四分五裂的国…

用负载绿原酸的纳米复合水凝胶调节巨噬细胞表型以加速伤口愈合

引用信息 文 章&#xff1a;Modulating macrophage phenotype for accelerated wound healing with chlorogenic acid-loaded nanocomposite hydrogel. 期 刊&#xff1a;Journal of Controlled Release&#xff08;影响因子&#xff1a;10.8&#xff09; 发表时间&a…

【数据结构】C语言实现二叉树的基本操作——二叉树的遍历(先序遍历、中序遍历、后序遍历)

C语言实现二叉树的基本操作 导读一、二叉树的遍历二、先序遍历三、中序遍历四、后序遍历五、结点序列六、递归算法与非递归算法的转化结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 通过前面的介绍&#xff0c;我们已经认识了二叉树…

五菱缤果Plus,便宜又大碗的纯电

五菱缤果Plus在技术和性能方面相较于比亚迪海豚有以下几个优势&#xff1a; 续航能力&#xff1a;五菱缤果Plus搭载了五菱液冷神炼电池和75kW三合一水冷扁线电机&#xff0c;能够提供最长510km的超长续航里程。相比之下&#xff0c;比亚迪海豚荣耀版的NEDC工况续航里程为401km…

NSSCTF-Web题目6

目录 [NISACTF 2022]checkin 1、题目 2、知识点 3、思路 [NISACTF 2022]babyupload 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]1z_unserialize 1、题目 2、知识点 3、思路 [NISACTF 2022]checkin 1、题目 2、知识点 010编辑器的使用、url编码 3、思路 打…

力扣--数组6.Z字形变换

思路分析 处理特殊情况&#xff1a; 如果numRows为1&#xff0c;那么字符排列与原字符串相同&#xff0c;无需进行转换&#xff0c;直接返回原字符串。 定义和初始化变量&#xff1a; n&#xff1a;字符串长度。k&#xff1a;一个完整的“V”字形周期长度&#xff0c;计算公式为…

哪些机构签发代码签名证书?

在数字化快速发展的今天&#xff0c;软件安全已成为全球关注的焦点。代码签名证书&#xff0c;作为一种数字证书&#xff0c;不仅保障了软件在传输过程中的安全性和可靠性&#xff0c;还为用户提供了信任的基石。本文将深入探讨代码签名证书颁发机构&#xff08;CA&#xff09;…

《科技资讯》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《科技资讯》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊 问&#xff1a;《科技资讯》是什么级别的&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;北京市科学技术研究院 主办单位&#xff1…

⌈ 传知代码 ⌋ 辅助任务改进社交帖子多模态分类

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

基于SpringBoot+Vue二手家电管理平台设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

[word] word2019中制表符的妙用 #媒体#笔记#知识分享

word2019中制表符的妙用 word2019表格功能是非常强大的&#xff0c;很多朋友都认为以前的制表符已经没有什么用途了&#xff0c;其实不然&#xff0c;在一切特殊的场合&#xff0c;word2019制表符还是非常有用的&#xff0c;下面就为大家介绍word2019中制表符的妙用。 步骤1、…

前端html-docx实现html转word,并导出文件,文字+图片

前端html-docx实现html转word&#xff0c;并导出文件 前端web页面 有文字&#xff0c;有图片&#xff0c;保存web的css效果 使用工具&#xff1a;html-docx 官方网址&#xff1a;http://docs.asprain.cn/html-docx/readme.html 步骤&#xff1a; 1 npm install html-docx-js…

收银系统源码推荐

1.收银系统源码开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后台管理网站: HTML5vue2.0element-uicssjs收银端【安卓/PC收银】: Dart3&#xff0c;框架&#xff1a;Flutter 3.11.0-6.0.pre.27商家小程序助手端: uniapp线上商城: uniapp 2.功能介绍 支持测试体验…