`
chengda
  • 浏览: 39855 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

    我们知道Java applet在浏览器中运行时默认情况下是不能访问本地资源的,比如读写客户端电脑上的文件。这是Java的安全沙箱机制,简单说就是有一组安全检查规则,要通过检查之后才能访问特定资源。不过在企业应用中这种安全机制有时候并不是十分必要,这里我们就讨论一下在企业应用中突破沙箱检查的方案。

     当然,很多朋友会说,这太简单了,只需要改一下java.policy就可以了,授予程序对所有权限就可以了,就像下面这样:

      grant {
           permission java.security.AllPermission;
      };

没错,这样确实可以使客户端applet有权限访问任何资源,但是这个方案有个很实际的问题:java.policy是位于每个客户端电脑的jre目录下的,如果要修改,那么就需要通知每一个使用该系统的用户,并指导他们做相应操作。这对于搞IT的用户来说是小菜一碟,但对一般业务人员来说却是个额外的工作,这样的发布方式很难被人认可。

 

     另一个方案——对applet进行签名,用户访问时系统会弹出安全提示框,用户如果信任该程序,点击确认就相当于赋予了这个客户端小程序访问本地资源的权限。这是个很典雅的方案,体现了系统安全和对用户权利的尊重!具体做法大致如下:

    1、编写applet,编译并打成jar包

    2、对jar包签名

         这一步首先要产生证书,利用jdk提供的工具,执行类似下面的命令:

        keytool -genkey -keystore d:\mykeys.store -alias test -validity 300

        根据系统提示执行完这个命令后会生成一个证书库,上例是:mykeys.store,-validity 300是证书有效期为300天的意思,接下来用这个证书库中的证书给jar包签名,仍然是jdk的工具,命令类似下面:

        jarsigner -keystore d:\mykeys.store d:\applet.jar test

    3、把applet.jar发布到应用服务器

 

     这个看似完美的方案实际也有一点问题,很多时候我们并不希望把客户端程序都打到一个jar包里,那么多个jar包就需要分别签名,每次修改完客户端程序,都要重新打包和签名,不然就只有applet能访问本地资源。我们不想这么麻烦,甚至我们有时都不希望对客户端代码打包,这时候签名就不好实现了。那么如何解决这个问题呢,看下面这招。

     既然applet已经被用户授权,那么是否可以在applet里改变安全管理器(SecurityManager)?实验证明是可以的!只需要继承SecurityManager类,创建自己的安全管理器类,然后覆盖checkPermission方法,允许访问任何资源。在applet的init方法中调用System.setSecurityManager把安全管理器设置为我们自己的就一切OK了!

 

     至此,我们彻底突破了沙箱检查,而且客户体验很好,完美的方案!

    

 

 

      

1
0
分享到:
评论
3 楼 landmine 2012-07-06  
java.security.cert.CertificateParsingException: no more data allowed for version 1 certificate
	at sun.security.x509.X509CertInfo.parse(Unknown Source)
	at sun.security.x509.X509CertInfo.<init>(Unknown Source)
	at sun.security.x509.X509CertImpl.parse(Unknown Source)
	at sun.security.x509.X509CertImpl.<init>(Unknown Source)
	at sun.security.provider.X509Factory.parseX509orPKCS7Cert(Unknown Source)
	at sun.security.provider.X509Factory.engineGenerateCertificates(Unknown Source)
	at java.security.cert.CertificateFactory.generateCertificates(Unknown Source)
	at com.sun.deploy.security.WIExplorerCertStore.generateCertificate(Unknown Source)
	at com.sun.deploy.security.WIExplorerCertStore.loadCertificates(Native Method)
	at com.sun.deploy.security.WIExplorerCertStore.load(Unknown Source)
	at com.sun.deploy.security.WIExplorerCertStore.load(Unknown Source)
	at com.sun.deploy.security.TrustDecider.isAllPermissionGranted(Unknown Source)
	at com.sun.deploy.security.TrustDecider.isAllPermissionGranted(Unknown Source)
	at com.sun.deploy.security.TrustDecider.isAllPermissionGranted(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.isAppletSigned(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)



这个问题是是否是没有突破沙箱,我这里已经实现签名了
2 楼 chengda 2009-08-26  
代码很简单,类似于下面这样即可:
public class MainApplet extends JApplet {

private class DefaultSecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission perm, Object context) {
}

@Override
public void checkPermission(Permission perm) {
}
}

@Override
public void init() {
super.init();
System.setSecurityManager(new DefaultSecurityManager());
   }
}
1 楼 lyh7609 2009-08-21  
好文,可否附上具体的代码啊

相关推荐

    行业分类-设备装置-基于JAVA字节码插桩和JAVA方法挂钩检测JAVA沙箱逃逸攻击.zip

    Java沙箱逃逸攻击是指恶意代码试图突破Java安全模型的限制,获取系统级权限或执行非授权操作的行为。为了防止这种攻击,开发者可以利用Java字节码插桩和方法挂钩技术来增强应用的安全性。本文将深入探讨这两种技术...

    [数据安全]Java生态圈沙箱逃逸实战.zip

    然而,攻击者可能会利用代码注入、反射、JNI(Java Native Interface)或其他漏洞来突破这些限制,实现沙箱逃逸,从而获取更高的系统权限,执行恶意操作。 1. **代码注入**:攻击者可能通过注入恶意代码到应用程序...

    java9-沙箱

    这样,即使存在恶意代码,也难以突破沙箱的限制。 5. **JEP 261:模块系统的主要特性**:Java 9的模块系统(JEP 261)是实现沙箱的关键。它定义了一套规则来控制模块间的依赖关系,确保代码的隔离和安全性。 了解...

    java Applet技术文档

    - Applet的安全模型:由于运行在用户机器上,Applet受到安全沙箱限制,不能访问本地文件系统或网络资源,除非用户明确授予权限。 - 数字签名:为了突破安全限制,开发者可以对Applet进行数字签名,以增加信任度。 ...

    Java语言入门Java语言入门的必备

    将注意力转向了Oak项目,并且在1995年,随着互联网的兴起,Sun Microsystems看到了Oak在互联网上的巨大潜力,并将其重新命名为Java,推出了HotJava浏览器,这是Java在互联网上应用的第一个重大突破。 - **1.1.2 ...

    A java virus broadcast simulation.zip

    在模拟中,需要考虑病毒如何突破沙箱限制。 10. **恶意软件分析**:在实际的反病毒研究中,理解Java代码的动态行为和静态特征是至关重要的。模拟可以帮助分析病毒的传播策略和行为模式。 通过以上知识点的讨论,...

    013-JAVA基础漏洞是如何自我修炼.pdf

    6. 设置访问权限:对于私有字段或方法,通过设置Accessible属性为true,可以突破Java访问控制的限制。 7. Method类的invoke方法:它是反射API中用于调用指定对象上指定方法的方法。通过传入Object实例和参数,可以...

    java基础教程

    - 在Java出现之前,已经有C、C++等语言,但Java在跨平台性方面取得了重大突破。 - Java语言的出现标志着面向对象编程(OOP)思想的广泛应用。 - **1.1.3 Java语言的结构** - Java语言的核心结构包括类、对象、...

    Java平台及应用Java技术的安全问题.zip

    攻击者可能试图找到方法突破沙箱限制,获取系统级权限。防止此类攻击的关键是保持系统更新,修补已知漏洞。 3. **反射和JNI滥用**:Java反射允许运行时访问类和对象,而Java本地接口(JNI)允许调用本地库。这些...

    java+applet 聊天程序

    为了突破沙箱的限制,Applet可以被签名,这需要开发者购买并使用数字证书。签名的Applet可以获取更多的权限,但同时也要求用户确认信任该代码。 9. **现代Web技术的替代** 尽管Java Applet曾经是创建富互联网应用...

    java 很好的文档

    Java 的出现,则是在这一系列进化基础上的一次重大突破。 #### 3. Java 的诞生 ##### 3.1 Java 的由来 Java 被广泛认为是 C++ 的后继者,同时也继承了许多来自 C 和 C++ 的特征。Java 的语法结构很大程度上沿袭了...

    java安全通信的建立以及数字证书的制作与使用

    在Applet场景中,为了突破安全沙箱的限制,开发者通常需要对Applet进行签名。签名的过程就是使用私钥对Applet的代码进行签名,生成的数字签名会附在Applet的JAR文件中。当用户浏览器加载Applet时,会验证这个签名,...

    java学习指南

    - **安全性**:Java内置的安全模型和沙箱机制,有效地防止了恶意代码的执行,保护了用户数据的安全。 - **丰富的API库**:Java提供了一套全面的API集合,涵盖了网络、图形用户界面、数据库连接等多个领域,极大地...

    Java和因特网.docx,原文+译文。

    然而,Java 不仅能解决传统独立应用程序的问题,它在互联网编程领域的应用才是其真正的突破点。 1. 客户端编程(Client-side Programming) 互联网最初的设计是基于服务器-浏览器模式,这种模式允许交互式内容的...

    外文文献及翻译-Java-and-the-Internet.doc

    虽然Java在解决独立的编程问题上非常有用,但其真正的突破在于它为万维网(World Wide Web)解决了编程难题。 1. 客户端编程 早期的Web设计基于服务器-浏览器模式,虽然可以提供互动内容,但互动完全由服务器端...

    Java平台及应用Java技术的安全问题分析.pdf

    然而,沙箱有时可能存在漏洞,使得恶意代码可以突破限制,访问受保护的系统资源。例如,一些Java应用程序可能没有正确配置安全策略,允许不受信任的代码执行高权限操作。 除了上述底层技术层面的安全问题,Java应用...

    Applet

    2. **签名Applet**:为了突破沙箱限制,开发者可以对Applet进行数字签名,让用户在了解风险后自行决定是否授予额外权限。 ### 六、实践应用 尽管Applet的使用已经减少,但在特定领域如科学计算、教育软件、在线...

Global site tag (gtag.js) - Google Analytics