gpt4 book ai didi

html - 为 HTML 中嵌入的 Applet 设置策略

转载 作者:行者123 更新时间:2023-12-01 05:08:13 25 4
gpt4 key购买 nike

我设计了一个小程序来使用 java.awt.Robot 类截取屏幕截图并将其保存在用户计算机上。我需要将此小程序嵌入到 html 页面中(使用对象标记),以便当用户单击网页上的按钮时截取屏幕截图。

小程序本身工作正常,我通过向其中添加临时 main 方法并在本地计算机上将其作为常规 java 应用程序运行来对其进行了测试。

我遇到困难的是设置权限以允许它从嵌入位置运行。显然,机器人类有些危险,因此需要建立 AWTPermission 并且需要对小程序本身进行签名。

我按照 http://download.oracle.com/javase/tutorial/security/toolsign/index.html 上的教程进行操作并成功创建了一个签名的 .jar 文件,然后是一个允许该教程中的演示应用程序运行的策略文件。我现在遇到的问题是如何将我所学到的知识与我的小程序的使用情况相协调。

我的目标受众包括大约 100 台机器,我需要它能够在所有机器上执行。我已将 java .class 文件打包到 .jar 中,并使用 keytool 和 jarsigner 对其进行签名。然后,我将 .jar 和 .cer 文件上传到托管相关页面的服务器目录。

但是:当我使用策略工具在其中一台计算机上创建新的策略文件来测试设置时,我仍然无法从 HTML 执行小程序。我收到 Java.Security.AccessControlException Acess Denied java.awt.AWTPermission createRobot 错误。

我相当怀疑政策步骤出了问题,所以我将概述我所采取的步骤:我将证书下载到本地计算机并从中生成 keystore ,我通过命令行从此目录启动“policytool”我在本地计算机上添加生成 keystore 和我的证书所在的目录。然后,我点击添加策略按钮并输入 SignedBy 别名然后添加权限并选择 AWTPermission目标名称我选择createRobot我一直将功能字段留空,因为我无法想象这里适用什么此窗口中的签名者也留空然后,我点击“确定”和“完成”,并收到一条警告,提示我在第一步中输入的别名没有公钥。我执行“另存为”并将策略文件保存到放置证书和从中生成的 keystore 的同一目录中。

这不允许我从网页运行小程序,而且我对编程这方面的有限理解没有提供任何关于出了什么问题的线索。

想法、想法、观察?如果我没有明确提到某件事,那么我就没有这样做。我最大的怀疑是我收到的警告,但我似乎找不到它出现的原因

编辑:忘记提及一个步骤。我手动将“policy.url.3=file:/C:/Testing/debugpolicy”行添加到我的 jre\lib\security\java.security 文件中,因为这是我在上述步骤中创建的路径和策略文件名。我刚刚还设法删除了我之前提到的警告,我混淆了我的别名,并在创建策略文件期间为私有(private) keystore 而不是公共(public) keystore 提供了别名,但是我仍然遇到相同的问题

最佳答案

如果小程序正确签名,则不需要策略文件,也不需要单独上传任何证书。正确签名的小程序将在加载之前在访问该小程序时提示用户获得许可。是否出现提示?

这是一个小演示。我写的演示 Defensive loading of trusted applets 。这就是我指的安全提示。

如果小程序经过开发人员的数字签名并受到最终用户的信任,则它应该能够截取屏幕截图。

如果小程序可信,您还可以尝试另一件事,就像实验 (1)。 在小程序 init() 的早期,调用 System.setSecurityManager(null)。这将测试小程序是否具有信任,并清除给予小程序的“可信”安全管理器的最后残余。

如果有效,并且屏幕捕获成功,则表明存在错误或 Oracle 改变了对可信小程序默认功能的看法。

1) 不要在现实世界或生产环境中这样做。引用 Tom Hawtin 的话:

This question appears to have given some the impression that calling System.setSecurityManager(null); is okay. ... In case anyone has any doubts, changing global state in an applet will affect all applets in the same process. Clearing the security manager will allow any unsigned applet to do what it likes. Please don't sign code that plays with global state with a certificate you expect anyone to trust.

<小时/>

编辑1:这是该演示中使用的简单小程序的源代码。由于某种原因,当我最初上传它时,我认为来源不相关。 OTOH 现在有 3 个人出于某种原因要求查看消息来源。当我收到一轮学费时,我会将源代码上传到我的网站。同时,我会把它放在这里。

package org.pscode.eg.docload;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.security.*;

/** An applet to display documents that are JEditorPane compatible. */
public class DocumentLoader extends JApplet {
JEditorPane document;

@Override
public void init() {
System.out.println("init()");

JPanel main = new JPanel();
main.setLayout( new BorderLayout() );
getContentPane().add(main);
try {
// It might seem odd that a sandboxed applet can /instantiate/
// a File object, but until it goes to do anything with it, the
// JVM considers it 'OK'. Until we go to do anything with a
// 'File' object, it is really just a filename.
File f = new File(".");

// set up the green 'sandboxed page', as a precaution..
URL sandboxed = new URL(getDocumentBase(), "sandbox.html");
document = new JEditorPane(sandboxed);
main.add( new JScrollPane(document), BorderLayout.CENTER );
// Everything above here is possible for a sandboxed applet

// *test* if this applet is sandboxed
final JFileChooser jfc =
new JFileChooser(f); // invokes security check
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
jfc.setMultiSelectionEnabled(false);

JButton button = new JButton("Load Document");
button.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent ae) {
int result = jfc.showOpenDialog(
DocumentLoader.this);
if ( result==JFileChooser.APPROVE_OPTION ) {
File temp = jfc.getSelectedFile();
try {
URL page = temp.toURI().toURL();
document.setPage( page );
} catch(Exception e) {
e.printStackTrace();
}
}
}
} );
main.add( button, BorderLayout.SOUTH );

// the applet is trusted, change to the red 'welcome page'
URL trusted = new URL(getDocumentBase(), "trusted.html");
document.setPage(trusted);
} catch (MalformedURLException murle) {
murle.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (AccessControlException ace) {
ace.printStackTrace();
}
}

@Override
public void start() {
System.out.println("start()");
}

@Override
public void stop() {
System.out.println("stop()");
}

@Override
public void destroy() {
System.out.println("destroy()");
}
}

关于html - 为 HTML 中嵌入的 Applet 设置策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12422778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com