Java安全管理器-SecurityManager

定义:

SecurityManager是Java中的一个类,用于实现安全管理功能。它允许应用程序在运行时对安全策略进行动态管理,并控制哪些操作可以执行,哪些应该被拒绝。主要功能包括:

  • 安全策略管理:SecurityManager允许定义一组安全策略,这些策略规定了在运行时哪些操作是允许的,哪些是禁止的。

  • 权限控制:通过SecurityManager可以控制对敏感资源的访问权限,比如文件系统、网络等。

  • 安全检查:在应用程序执行敏感操作之前,SecurityManager可以进行安全检查,以确保当前线程是否有权限执行该操作。

  • 自定义安全策略:开发人员可以扩展SecurityManager类,实现自定义的安全策略,以满足特定应用程序的安全需求。

尽管SecurityManager提供了强大的安全管理功能,但在现代Java应用程序中,它已经不太常用了。相反,通常会使用更先进的安全解决方案,如安全框架、安全协议等来提供更全面和灵活的安全保护。

沙箱

其实在了解这个SecurityManager 的同时,应该了解一下代码沙箱(sandbox)。是一种安全机制,用于在受信任的环境中执行不受信任的代码,以防止恶意行为或不良影响。它通常用于网络浏览器、虚拟机、容器等环境中,以限制代码的访问权限和影响范围。
在网络浏览器中,代码沙箱允许网页上的 JavaScript 代码在受控制的环境中运行,以防止恶意代码对用户数据或系统的损害。通过沙箱,浏览器可以限制 JavaScript 代码对浏览器 API 和用户系统的访问权限,从而保护用户隐私和系统安全。
在虚拟机和容器中,代码沙箱用于隔离不同的应用程序或服务,以防止其中一个应用程序对其他应用程序或主机系统造成损害。通过沙箱,每个应用程序或服务都被限制在自己的受控环境中运行,不能访问或影响其他应用程序或主机系统。

如何保护代码沙箱呢?

这里就需要我们的安全管理器了SecurityManager,定义了很多权限。我们可以自定义一个类来继承SecurityManager这个类。如下图:
在这里插入图片描述
我们这里定义了一个DefaultSecurityManager 类。默认的安全管理器。继承SecurityManager,实现checkPermission方法来进行拦截权限的校验。
当然我们可以使用我们自定义类来编写各种权限的接口哈。
比如:我们创建一个MySecurityManager 类。继承SecurityManager方法。我们可以看看里面都可以实现什么样子的方法。有点像MyBatisPlus。里面已经给你封好方法
在这里插入图片描述
这里我实现了几个常用的方法

/**
 * 我的安全管理器
 */
public class MySecurityManager extends SecurityManager {

    @Override
    public void checkPermission(Permission perm) {
        //默认情况下,不做任何检查  所有权限放开
//        super.checkPermission(perm);
    }

    /**
     * 检查执行系统命令的权限。
     *
     * @param cmd the specified system command.
     */
    @Override
    public void checkExec(String cmd) {
        throw new SecurityException("checkExec 权限异常:" + cmd);
    }

    /**
     * 检查读取文件的权限。是否允许读文件
     *
     * @param file the system-dependent filename.
     */
    @Override
    public void checkRead(String file) {
        if (file.contains("F:\\Code\\CaDaOJ-code-sandbox\\")) {
            return;//放行
        }
        throw new SecurityException("checkRead权限异常:" + file);
    }

    /**
     * 检查写文件的权限。
     *
     * @param file the system-dependent filename.
     */
    @Override
    public void checkWrite(String file) {
        throw new SecurityException("checkWrite 权限异常:" + file);
    }

    /**
     * 检查删除文件的权限。
     *
     * @param file the system-dependent filename.
     */
    @Override
    public void checkDelete(String file) {
        throw new SecurityException("checkDelete 权限异常:" + file);

    }

    /**
     * 检查程序是否可以连接网络
     *
     * @param host the host name port to connect to.
     * @param port the protocol port to connect to.
     */
    @Override
    public void checkConnect(String host, int port) {
        throw new SecurityException("checkConnect权限异常:" + host + ":" + port);
    }
}

启动

在我们需要校验的地方直接加上这句话

System.setSecurityManager(new DefaultSecurityManager())

实际运用

实际情况下,不应该在主类中做限制,只需要限制子程序的权限即可。

启动子进程执行命令时,设置安全管理器,而不是在外层设置。
当然也可以把他整成一个配置文件。把它放到 resources/security目录下,配置类编写成一个Java源文件,然后使用Java编译器将其编译成字节码文件(.class),最后将这个字节码文件作为资源打包到你的应用程序中。
注意:移除类的包名!移除类的包名!移除类的包名!
创建一个Java源文件,命名为MySecurityManager.java,包含你的配置类代码:

import java.security.Permission;

public class MySecurityManager extends SecurityManager {

    @Override
    public void checkPermission(Permission perm) {
        // 在这里实现你的权限检查逻辑
        // 这只是一个简单的示例,可以根据具体情况进行修改
        if (perm.getName().equals("setSecurityManager")) {
            // 如果试图设置SecurityManager,则抛出SecurityException
            throw new SecurityException("权限不足");
        }
    }

    // 其他重写的checkXXX方法根据需要进行实现
    // 例如:checkRead、checkWrite等等
}

使用Java编译器(javac)编译MySecurityManager.java文件,生成字节码文件MySecurityManager.class:
javac MySecurityManager.java
在你的应用程序中,使用ClassLoader加载嵌入的MySecurityManager类:

import java.io.InputStream;

public class Main{

    public static void main(String[] args) {
        // 使用ClassLoader加载嵌入的资源文件
        ClassLoader classLoader = MyApp.class.getClassLoader();
        try (InputStream inputStream = classLoader.getResourceAsStream("MySecurityManager.class")) {
            byte[] buffer = new byte[inputStream.available()];
            inputStream.read(buffer);
            // 使用defineClass方法加载类
            Class<?> mySecurityManagerClass = ClassLoader.defineClass("MySecurityManager", buffer, 0, buffer.length);
            // 创建并设置自定义的SecurityManager
            SecurityManager sm = (SecurityManager) mySecurityManagerClass.getDeclaredConstructor().newInstance();
            System.setSecurityManager(sm);

            // 程序的其他逻辑...
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这样,你就可以将配置类作为资源嵌入到你的应用程序中,并在运行时使用ClassLoader加载它,从而设置自定义的SecurityManager。请注意,这种方法可能会增加应用程序的复杂性,建议在需要时使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE之锁策略,cas 和 synchronized 优化过程深入浅出

目录 题外话 正题 锁策略 乐观锁和悲观锁 轻量锁和重量锁 CAS算法(Compare And Swap) 自旋锁和挂起等待锁 普通互斥锁和读写锁 公平锁和非公平锁 可重入锁和不可重入锁 synchronized原理 基本特点 锁升级 其它锁优化 锁消除 锁粗化 小结 题外话 时间紧任务重,直…

C++-基础

C语言介绍 C 是一种通用编程语言&#xff0c;具有高性能、灵活性和广泛的应用领域。它是在 1979 年由 Bjarne Stroustrup 开发的&#xff0c;最初被称为“C with Classes”&#xff0c;随后在 1983 年正式更名为 C。C 基于 C 语言&#xff0c;同时引入了面向对象编程&#xff0…

【MATLAB源码-第51期】基于matlab的粒子群算法(PSO)的栅格地图路径规划。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述&#xff1a; 基本思想&#xff1a; 鸟群在寻找食物时&#xff0c;每只鸟都…

003 【笔记神器】Obsidian:打造属于自己的万能工作台

前言&#xff1a;Obsidian 是一款很多大神都在用的笔记软件&#xff0c;具有强大的功能&#xff0c;能够满足日常各种笔记的需求。强大之处在于&#xff1a;Obsidian 能够安装各种强大的插件&#xff0c;实现各种功能。 废话不多说&#xff0c;玩转 Obsidian 仅需这篇文章足矣&…

Linux/Iclean

Iclean Enumeration nmap 先使用默认规则扫描常用的端口&#xff0c;发现对外开放了 22 和 80 端口&#xff0c;然后扫描这两个端口的详细信息&#xff0c;结果如下&#xff0c;很常规的结果&#xff0c;没发现什么有趣的东西 ┌──(kali㉿kali)-[~/vegetable/HTB/Iclean] …

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议&#xff08;CHHASD2024&#xff09;将在中国武汉举行&#xff0c;主题为“文化、历史&#xff0c;人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…

反爬虫之代理IP封禁-协采云IP池

反爬虫之代理IP封禁-协采云IP池 1、目标网址2、IP封禁4033、协采云IP池 1、目标网址 aHR0cDovL3d3dy5jY2dwLXRpYW5qaW4uZ292LmNuLw 2、IP封禁403 这个网站对IP的要求很高&#xff0c;短时间请求十几次就会遭关进小黑屋。如下图&#xff1a; 明显是网站进行了反爬处理&…

ubuntu22安装snipaste

Ubuntu 22.04 一、Snipaste 介绍和下载 Snipaste 官网下载链接: Snipaste Downloads 二、安装并使用 Snipaste # 1、进入Snipaste-2.8.9-Beta-x86_64.AppImage 目录&#xff08;根据自己下载目录&#xff09; cd /home/jack/Downloads/softwares/AppImage# 2、Snipaste-2.8.9-…

图像分类——综合车辆数据集

一、重要性及意义 智能交通管理&#xff1a;车辆图像分类是智能交通系统&#xff08;ITS&#xff09;中的关键组成部分。通过对监控摄像头捕捉到的车辆图像进行自动分类&#xff0c;系统能够实时识别车辆类型、颜色、品牌等信息&#xff0c;进而实现交通流量监控、违章行为检测…

在线知识库如何从零开始搭建?这篇文章来教你!

引言&#xff1a; 有没有想过把那些零散在脑海中的点点滴滴整理起来&#xff0c;建立一个属于自己的在线知识库&#xff1f;无论是个人学习&#xff0c;团队协作&#xff0c;还是企业管理&#xff0c;一个良好的知识库都能帮我们更高效地存储和分享知识。如果你还在为“怎么建知…

YesPMP众包平台 | 活动有礼,现金奖励点击领取!

YesPMP众包平台在线发福利啦&#xff0c;4月16日活动火热开启&#xff0c;现金奖励等你来领&#xff0c;最高可领千元&#xff0c;赶快参与将奖励收入囊中&#xff0c;一起来了解活动细节吧&#xff01; 一、活动内容&#xff1a; 活动一&#xff1a;【项目征集令】活动&…

告别传统开发,用这11个网站模板搭建的零售线上商城,制作成本都大幅降低了

随着人工智能时代的到来&#xff0c;很多复杂的工作再日益变得简单。比如20年前开发一个在线商城完成支付交易&#xff0c;那是一个不得了的事情&#xff0c;现在的零售巨头淘宝和京东就是在那个时代崛起的。新时代涌现出了许多新的工具&#xff0c;比如使用低代码平台搭建的自…

【网站项目】驾校报名小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

使用Python生成二维码

1、背景 上一次我们介绍了什么是二维码&#xff0c;读过这篇文章以后&#xff0c;相信大家对二维码已经有了一定的认识&#xff0c;那么有没有想过如何自己动手生成二维码呢&#xff1f;二维码在我们的生活与工作中&#xff0c;都能够做什么呢&#xff1f;今天我们来探讨一下用…

2.Mysql 多实例的部署和应用

Mysql多实例的概念&#xff1a; MySql多实例就是在一台机器上开启多个不同的服务端口&#xff0c;运行多个MySql服务进程&#xff0c;通过不同的socket监听不同的服务端口来提供各自的服务。 这些Mysql多实例共用一套MySql安装程序&#xff0c;使用不同的my.cnf&#xff08;也可…

ThreadX在STM32上的移植:通用启动文件tx_initialize_low_level.s

在嵌入式系统开发中&#xff0c;实时操作系统&#xff08;RTOS&#xff09;的选择对于系统性能和稳定性至关重要。ThreadX是一种广泛使用的RTOS&#xff0c;它以其小巧、快速和可靠而闻名。在本文中&#xff0c;我们将探讨如何将ThreadX移植到STM32微控制器上&#xff0c;特别是…

计算机网络 Cisco路由信息协议(RIP)实验

一、实验内容 1、命名 2、关闭域名解释 3、设置路由器接口IP地址 4、根据要求配置RIP以实现所有客户机都能相互通信 5、配置默认路由 二、实验数据处理 1、建立拓扑图 2、PC机地址配置 主机IP地址子网掩码网关PC110.23.1.2255.255.255.010.23.1.1PC210.23.1.3255.255.2…

[论文分享] Large Language Model guided Protocol Fuzzing

笔记目录 Large Language Model guided Protocol Fuzzing [NDSS 2024]IntroductionConstructionContribution BackgroundProtocol FuzzingChallenges Large Language ModelsMotivation Case StudyLifting Message Grammars: Quality and DiversityEnriching the Seed Corpus: D…

如何利用open3D来生成OCC

config.yaml depth: 10&#xff1a;#深度&#xff0c;设定为10&#xff0c;常用于决定处理或计算的层次或深入程度。 min_density: 0.1&#xff1a;#最小密度&#xff0c;设置为0.1&#xff0c;用于过滤或选择的密度阈值。 n_threads: -1&#xff1a;#线程数&#xff0c;设为-…

群晖(Synology)NAS 启用 SSH

群晖&#xff08;Synology&#xff09;NAS 是可以启用 SSH 的。 如果使用 SSH 命令&#xff0c;我们可以在 NAS 上运行相关的 Linux 命令&#xff0c;比如说在服务器网络传输数据上&#xff0c;就会有明显的优势了。 如何启用 进入 NAS 的服务器控制台&#xff0c;然后找到终…