Java魔法之SecurityManager

Java魔法之SecurityManager

介绍一些关于SecurityManager的使用案例。

介绍

我们可以通过sun.misc.Unsafe做一些可怕的事情(操作底层)。

SecurityManager 刚好相反,提供防护措施,阻止一些敏感操作(如io、网络、反射等)。

如果操作不允许,则抛出``SecurityExeption异常。

SecurityManager manager = System.getSecurityManager();
if (manager != null) {
    manager.checkAction(action);
}

一些案例

设想一个场景:系统功能迭代升级,我们在开发一些代码后,需要提交。

当然,运行不受信任的代码是不安全的,所以我们需要确保代码提交者不会危害整个系统。

例如,sumbitter可以读取密码并修改数据库中的某些条目。更糟糕的是,它可能会填满整个文件系统、内存或消耗所有线程,并阻止其他提交者进行处理。

SecurityManager就是解决这些事情的。

首先 我们可以扩展这个类,实现自身的一些拦截策略:

/**
 * 扩展SecurityManager限制一些访问操作
 */
public class MySecurityManager extends SecurityManager {

    @Override
    public void checkRead(FileDescriptor fd) {
        throw new SecurityException("File reading is not allowed");
    }

    @Override
    public void checkWrite(FileDescriptor fd) {
        throw new SecurityException("File writing is not allowed");
    }

    @Override
    public void checkConnect(String host, int port) {
        throw new SecurityException("Socket connections are not allowed");
    }
}

然后, 在运行时设置这个安全管理器。

System.setSecurityManager(new MySecurityManager());

观测到SecurityManager的check前缀的方法时,JVM会做大量的检查。

虽然,安全管理器是配置对子系统的访问和防止不可信代码做坏事的有用工具,但有些操作不受安全管理器的控制。

内存分配

内存分配不受SecurityManager管理控制,如果需要去验证一些不受信任的代码是否可靠,可以考虑使用单的的JVM并且设置一下最大内存比如:java -Xmx128m

lib库

你可以使用SecurityManager.checkPackageAccess方法限制整个包的使用。

参考: http://mishadoff.com/blog/java-magic-part-5-securitymanager/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值