本文介绍在Java平台上如何访问受限资源,比如读写一个文件。我们通过配置policy文件来使得一个未签名的applet访问系统的受限资源。本文主要由以下内容组成:
- 对于Applet的限制
- 如何配置Policy文件
- 如何使Policy生效
对于Applet的限制
Java插件使用Security Manager来防止病毒通过applet侵入你的系统。如果未签名的applet想访问某个系统资源,Security Manager会检查对应的权限是否已经授权,未授权的applet无法访问系统资源。授权需要配置policy文件中的entry。
Oracle官方提供了一个applet的例子。
import java.awt.*; import java.io.*; import java.lang.*; import java.applet.*; public class WriteFile extends Applet { String myFile = "writetest"; File f = new File(myFile); DataOutputStream dos; public void init() { String osname = System.getProperty("os.name"); } public void paint(Graphics g) { try { dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(myFile),128)); dos.writeChars("Cats can hypnotize you when you least expect it\n"); dos.flush(); g.drawString("Successfully wrote to the file named " + myFile + " -- go take a look at it!", 10, 10); } catch (SecurityException e) { g.drawString("writeFile: caught security exception: " + e, 10, 10); } catch (IOException ioe) { g.drawString("writeFile: caught i/o exception", 10, 10); } } }
由代码可知,该applet的功能是创建并写一个名为writetest的文件。当然,在没有修改policy文件前,操作应该被禁止。
在你的command窗口输入以下命令去执行该applet:
期望的行为是,你会看到一个security的异常。
如何配置Policy文件
Policy文件是一个ASCII的文本文件。你可以通过文本编辑器或者图形化界面的Policy工具去编辑它。Policy工具好处在于使用方便,不需要知道很详细的policy文件语法,并降低错误的概率。本小节使用Policy工具创建一个名为examplepolicy的policy文件,并在其中添加一个entry来授权存放WriteFile.class文件的目录创建/写名为writetest的文件。
使用Policy Tool
在使用之前,请先确认你的机器安装并配置了JDK。在命令行工具中,执行policytool。如果命令不存在,请在$JAVA_HOME/bin目录里找找,windows用户可以找到exe可执行文件。命令会打开policytool的GUI,如下图:
从图上可以看到,工具并没有显示任何的policy信息。那是因为,工具启动后会尝试读取用户的policy文件并把对应的信息显示在界面上。用户的policy文件默认以.java.policy来命名。它会保存在用户的Home目录下。如果没找到policy文件,则空白显示,如上图。接着我们会创建一个新的policy文件。
授权
Entry是权限的载体。单击‘Add Policy Entry’按钮来创建一个新的entry。接着,你会看到Policy Entry对话框,如下图:
单个entry可以指定一个或多个权限。代码来自于特定的代码源(URL),代码被特定的entity签名。
CodeBase和SignedBy文本框指定哪些代码需要授权。
- CodeBase代表代码源路径。你授权的代码就来自于这个值所对应的路径。注意,空值代表任何代码。
- SignedBy代表keystore中证书的alias。证书中的公钥用于验证代码的数字签名。代码使用该公钥对应的私钥来签名。SignedBy这个栏位是选填的。不填,代表了"any signer",系统不care代码是否签名,是谁签的。
我们继续使用WriteFile这个例子。如果你想让这个applet拥有创建和写文件的权限,你可以在CodeBase栏位输入:
SignedBy不填,因为代码不签。接着我们来授权。点击Add Permission按钮,你会看到如下对话框:
请按照以下步骤授权:
1. 在Permission下拉框选择FilePermission
2. 在Target Name下拉框右侧的文本框内输入writetest。这是你想授权的文件的文件名。
3. 在Actions下拉框内选择write。
完成后如下图:
点击OK按钮后,界面如下:
点击Done按钮,配置结束。
保存Policy文件
点击File菜单,选择Save As后,填写文件名examplepolicy,选择保存路径后,点击Save按钮保存。导航到你指定的目录,打开Policy文件,你会看到如下语句:
grant codeBase "http://docs.oracle.com/javase/tutorial/security/tour1/examples/" { permission java.io.FilePermission "writetest", "write"; };
注意文件后缀最好是.java.policy。
如何使Policy生效
既然我们已经创建好Policy文件,就可以再次使用WriteFile applet做个测试。
当你使用security manager运行一个应用的时候,被指定在如下特定文件中的Policy文件会被默认加载。
注:jre.home = jdk.home/jre
你可以在java.security文件内找到如下代码:
policy.url.1=file:${java.home}/lib/security/java.policy policy.url.2=file:${user.home}/.java.policy
不难发现,上述配置属性的值是policy文件的路径。而属性名则按以下规则命名:
n为数字,所有Policy文件按如下规则配置到java.security文件中。
URL代表你的Policy文件路径,必须符合URL的规则。
此外,我们还可以发现,已经有一些默认的Policy文件被系统加载。首先是java.policy,这个文件和java.security位于同一目录下。此外,还有用户目录下的policy文件。
之前我们创建了一个名为examplepolicy的文件,若要把它加到运行时的policy中,有如下两种方式。
方式一
使用命令行参数-J-Djava.security.policy,如下:
注意policy和URL之间有个空格。
方式二
在本小节开始部分介绍了java.security文件和在其中指定Policy文件的方法。这种方式比方式一更通用。
在java.security文件中找到policy.url.2,在下方增加一行policy信息:
配置保存后,执行如下命令即可:
appletviewer http://docs.oracle.com/javase/tutorial/security/tour1/examples/WriteFile.html
相关推荐
2. **创建Policy文件**:Java安全经理通过读取策略文件来确定哪些代码段可以执行哪些操作。为了给Applet提升权限,我们需要创建一个自定义的策略文件,明确指定允许Applet执行的特定敏感操作。例如,可以在策略文件...
权限管理通过定义一系列的策略文件(`.policy`文件)来控制Applet可以执行的操作。策略文件定义了哪些代码拥有何种权限,比如是否允许读写本地文件。 - **策略文件的基本结构**:策略文件通常包含多个条目,每个...
2. **安全配置**:确保applet的安全策略文件(security.policy)设置得当,防止权限滥用。 3. **兼容性测试**:在不同浏览器和操作系统上进行充分的测试,确保applet的稳定性和兼容性。 总结,JasperReports ...
当使用`appletviewer`工具启动Applet时,可以通过自定义一个**policy文件**并指定运行参数`-J-Djava.security.policy=xxxx.policy`来覆盖默认的安全策略。这种方式允许开发者为特定Applet定制更灵活的访问控制规则。...
5. **运行Applet**:用户浏览器加载Applet时,会检查其数字签名和相应的策略文件,如果满足条件,Applet将被授予相应的权限运行。 在提供的文件列表中,我们看到以下文件: - `snmp.cer`:这可能是一个证书文件,...
同时,Applet的权限控制也是关键,通过设置`applet.policy`文件,我们可以限制Applet对本地资源的访问,只允许其进行必要的文件读写操作。 在服务器端,可能使用Servlet或者Spring MVC等框架来接收和合并文件块。...
总结来说,要超越Java Applet的安全限制,开发者可以为Applet的代码进行数字签名,然后配置Policy文件,赋予Applet特定的权限,如访问本地文件系统或特定网络资源。这种方式使得Applet可以在用户同意的情况下执行更...
以文章中提到的例子为例,如果一个Applet需要写入本地磁盘,但又不能无限制地访问整个文件系统,我们可以创建一个自定义的Policy实现来精确控制这种访问行为。具体步骤如下: 1. **确定权限需求**:明确哪些类型的...
你需要创建一个“applet.policy”文件,并配置适当的权限,然后在运行时指定该策略文件。 2. **引入javacomm20库**:在Applet中,你需要引入javacomm20的相关类,比如`javax.comm.CommPortIdentifier`,`javax.comm...
此外,`java.policy.applet`文件是Java安全策略文件,它定义了applet在客户端运行时可以执行的操作权限。在Applet中,由于安全性限制,它们通常不能访问本地文件系统或进行其他敏感操作,除非在安全策略文件中特别...
在Java中,安全策略主要通过`java.policy`文件来定义,该文件控制了Java虚拟机(JVM)执行代码时的安全权限。默认情况下,这个文件会限制一些可能带来安全隐患的操作,例如访问本地文件系统、网络通信或者执行敏感...
例如,它可以限制未经签名的Java applet或应用程序的访问权限,防止它们读取、写入或执行本地文件系统中的敏感数据。`local_policy.jar`中的策略通常较为严格,以保护用户的隐私和系统安全。 另一方面,`US_export_...
比如,Applet可能需要申请提升权限来访问本地文件系统,这需要使用`PolicyFile`和`java.security`包。 在提供的链接中,博主分享了FTP客户端Applet的源码,这对于学习和理解FTP客户端的实现非常有帮助。你可以通过...
- 这意味着图片浏览可能只限于网络上的资源,或者需要通过特定机制(如Java Policy文件)安全地访问本地文件。 8. **部署与运行**: - Applet需要通过Java Web Start或嵌入到HTML页面中运行,HTML页面需包含正确...
4. **Applet权限控制**:Java平台通过安全管理器来保护系统不受Applet的恶意操作。Applet的行为受到安装在浏览器中的安全管理器的严格监控,通过policy文件定义Applet的访问权限。`policytool`工具用于生成和编辑...
`java.policy.applet`可能包含了定义applet运行时权限的策略文件,控制applet可以访问哪些系统资源。 2. `image.class` - 这是编译后的Java类文件,可能包含一个与图片处理相关的类。在Java中,我们通常使用`java....
权限控制通过policy文件定义,管理员可以使用`policytool`工具来生成和编辑这些文件,以指定不同来源的代码可以执行的操作。 4. **应用程序权限控制**: 如果没有明确启用安全管理系统,应用程序将不受任何限制。...