Java魔法之SecurityManager

古城微笑少年丶 2023-05-28 09:48 57阅读 0赞

Java魔法之SecurityManager

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

介绍

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

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

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

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

一些案例

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

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

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

SecurityManager就是解决这些事情的。

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

  1. /** * 扩展SecurityManager限制一些访问操作 */
  2. public class MySecurityManager extends SecurityManager {
  3. @Override
  4. public void checkRead(FileDescriptor fd) {
  5. throw new SecurityException("File reading is not allowed");
  6. }
  7. @Override
  8. public void checkWrite(FileDescriptor fd) {
  9. throw new SecurityException("File writing is not allowed");
  10. }
  11. @Override
  12. public void checkConnect(String host, int port) {
  13. throw new SecurityException("Socket connections are not allowed");
  14. }
  15. }

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

  1. System.setSecurityManager(new MySecurityManager());

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

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

内存分配

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

lib库

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

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

发表评论

表情:
评论列表 (有 0 条评论,57人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java魔法

    一、什么是魔法值 魔法值,也叫做魔法数值、魔法数字,通常是指在代码编写时莫名出现的数字,无法直接判断数值代表的含义,必须通过联系代码上下文分析才可以明白,严重降低了代码的