Java沙箱机制的实现——安全管理器、访问控制器

一、Java沙箱机制

Java沙箱(sandbox)是Java安全模型的核心,那如何理解沙箱呢?

我们知道如果默认不作任何配置,我们所写的程序是可以直接访问机器上的任意资源的,例如操作文件、网络请求等。而当我们把程序运行在服务器时,如果不对程序加以限制,那么将大大增加系统的安全隐患。更甭提我们的程序中有部分代码并不是我们自己实现的,而是网络上的轮子。为了解决这种隐患,便有了沙箱机制。沙箱机制其实就是一个可以用来限制你程序运行的环境。

Java提供了沙箱机制,我们一般所说的打开沙箱,也是加-Djava.security.manager选项。并且Java沙箱还可以由程序员自我定制,它主要包括了以下几个部分:

  • 类加载器(class loader):所有的Java类都是通过类加载器加载的,可以自定义类加载器来设置加载类的权限。
  • 安全管理器(security manager):是核心API和操作系统之间的主要接口。实现权限管理,比存取控制器优先级高。
  • 访问控制器(access controller):访问控制器可以控制核心API对操作系统的存取权限,而这个控制的策略设定,可以由用户指定。

二、SecurityManager安全管理器

1. 什么是安全管理器

安全管理器是Java沙箱的基础组件。所谓安全管理器,是指在代码运行的过程中,禁止代码访问一些比较私密的信息或执行一些不安全代码。例如读取存储私密信息的文件夹,监听端口,甚至反射,修改正在运行的代码中的各种信息。

使用安全管理器之后,你就可以安全地运行一些来历不明的软件,如果这个软件做出一些你并不希望的操作,系统就会禁止这个操作并抛出一个异常。

简单举例,当我们应用程序中运行到System.exit()这行代码时,代码会首先通过 Java安全管理器去检查它是否有调用该函数的权利,没有则会抛出异常。

// =====:Client.class
System.exit();

// =====:System.class
public static void exit(int status) {
   
    Runtime.getRuntime().exit(status);
}

// =====:Runtime.class
public void exit(int status) {
   
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
   
    // =====:检查是否有执行exit的权利
        security.checkExit(status);
    }
    Shutdown.exit(status);
}

2. 认识SecurityManager安全管理器

上文中代码设计到一个类SecurityManager,这是实现Java安全机制中十分关键的一个类。根据 JavaDoc 中的介绍我们可以了解到:

SecurityManager是一个被用于应用程序实现安全策略的类。它允许应用程序在执行不安全或敏感操作之前确定该操作是什么,以及判断当前的安全上下文是否允许该操作被执行。为了实现所提到的这种安全机制,SercurityManager还包含了许多以check开头的检查方法,这些检查方法通常在被执行敏感操作前被调用。这种检查方法的调用通常如下所示:

SecurityManager security = System.getSecurityManager()</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值