【问题标题】:Copy/Paste not working in a signed Applet复制/粘贴在签名的 Applet 中不起作用
【发布时间】:2011-12-15 00:42:02
【问题描述】:

我有一个 签名 小程序(通过 jarsigner 正确验证),尽管文档告诉我,由于某种原因,它不允许从系统剪贴板复制和粘贴到 JTextField它应该适用于签名的小程序。

此外,我还有其他使用相同密钥文件签名的小程序,可以让我复制和粘贴文本。我在互联网上搜索了高低,似乎找不到任何线索。让我大吃一惊的是,似乎没有办法调试它(控制台中没有输出 - 没有抛出异常)。

有人对我如何调试它以找出为什么 Java 不喜欢这个特定的小程序有任何想法吗?

非常感谢您的任何建议!

【问题讨论】:

    标签: java applet clipboard next-generation-plugin signed-applet


    【解决方案1】:

    好吧,随着 2011 年 2 月 Java Plug-in 1.6.0_24 的发布,从系统剪贴板复制和粘贴被视为安全漏洞并被禁用。您可以在小程序之间复制和粘贴。但是,如果您尝试使用主剪贴板中的某些内容,则无法将其复制进去。

    因此,有几种解决方法可供选择。您可以回滚到插件的早期版本。这会起作用,但很可能所有未来的版本仍然会禁用复制和粘贴,所以你永远无法升级。

    另一种选择是提供一个自定义的 java 安全策略文件,它可以再次访问系统剪贴板。

    首先找到您的本地 Java 安全策略文件。该文件名为 java.policy,应位于 Java 安装的 lib\security 文件夹中。在 Windows 7 上,可以在 C:\Program Files (x86)\Java\jre6\lib\security 中找到它。 将此文件复制到您的主文件夹(例如 C:\Users\Kyle)。 将文件重命名为 .java.policy(注意开头的句点)。 在文本编辑器中编辑文件。找到这行文本:

    // "standard" properies that can be read by anyone
    

    像这样在它下面添加以下行:

    // "standard" properies that can be read by anyone
    permission java.awt.AWTPermission "accessClipboard";
    

    保存文件。 关闭所有打开的浏览器并确保在测试前 Java 没有运行。

    来源:http://blogs.oracle.com/kyle/entry/copy_and_paste_in_java

    【讨论】:

    • 谢谢 - 我已经看到了这个,但我的印象是它只对 UNSIGNED 小程序被禁用(根据我的研究)。签名的小程序应该仍然可以工作 - 另一个签名的小程序当前允许复制和粘贴。还有什么想法吗?
    • 你使用的是什么版本的java插件?你用什么浏览器测试这个?您是否收到允许/禁止复制/粘贴服务的提示?你检查过 clipService 演示吗? pscode.org/jws/api.html#cbs
    • 这是一个小程序,部署在多家公司的许多 JVM 上。我目前运行的是 1.6.0_26,但没有提示我允许/禁止复制/粘贴服务。如果我添加代码来处理访问系统剪贴板,它允许我并且我可以粘贴到该字段中。
    • @user1098932:我也有同样的问题。我将 accessClipboard 添加到我的策略中。我也签署了我的小程序(但它是自签名,而不是可信签名)。我认为它会运行正常,但仍然出现拒绝访问错误。一些博客告诉我,自签名小程序可以在开发环境(在这种情况下是我的计算机)上运行沙箱。你能告诉我这是真的吗?
    • 为什么它在java.policy 文件中显示properies 而不是properties,仍然是properies
    【解决方案2】:

    除了 Dennis 的概述,请参阅 OTN 的 Copy in sand-boxed app. in 1.6.0_24+

    虽然默认情况下 Ctrl-c 复制不再起作用,但可以为在“下一代”Java 插件中运行的任何小程序重新添加该功能。由于 Java Web Start 存在,JWS 通过提供沙盒复制。 JNLP API 的 javax.jnlp.ClipboardService,以及自 Sun 1.6.0_10 和下一代。插件,嵌入式小程序可以使用 JWS 部署并可以访问 JNLP API。

    另见

    • http://pscode.org/prop/js.html。直接链接到该线程中使用的测试小程序。它在沙盒小程序中提供复制功能。如果它在有问题的机器(浏览器、设置 ..whatever)上工作,您应该能够对其进行返工,以在签名的小程序中提供(无提示)粘贴。
    • 基于框架的Demo. of the ClipboardService,带有源代码和构建文件。

    【讨论】:

    • 想知道(以及@user1098932) - 为什么安全修复会影响 signed 小程序/webstartable?也许我错过了重点 - 我认为这是允许在沙盒环境中禁用的东西?
    • @kleopatra 这个问题是一个复杂而微妙的问题,我并不声称完全理解。最好在 Sami Koivu 的 Multiple Java Clipboard Vulnerabilities for Applets 上的博客条目(链接自 OTN 线程)中对此进行了解释。不幸的是,Kyle 博客条目以及 Dennis 的回答(以及大多数阅读此线程的人,似乎)似乎遗漏了什么是可以使用 ClipboardService 修复它。 :(
    • 是的,知道 Sami 的博客和 ClipboardService - 但他说的是来自不受信任 源的潜在有害 Java 代码获得对系统剪贴板的读/写访问权限(漏洞 1 和 2 ),以及对用户权限进行任何操作的完全权限提升 ..他对 c&p 要求的评论符合我的期望/i> 我可能很天真 :-) 观点是 iff 我经历了签名的所有麻烦,我根本不必担心安全限制
    • 即使是受信任的小程序(通常)也会有一个沙盒。像System.exit(n) 这样的东西永远不应该在applet 中调用。至于由于 trusted 小程序完全使用剪贴板可能会导致什么问题,我必须承认我不知道。我能提供的最好解释是,也许他们正在采取这种态度 - 安全胜过抱歉。
    【解决方案3】:

    我不知道为什么,但我使用的 JTextField 对象似乎没有正确连接到关键事件(可能是因为我添加了 FocusListener?) - 但添加了以下代码:

        searchTextField.addKeyListener(new java.awt.event.KeyListener() {
            public void keyPressed(KeyEvent e) {
                //System.out.println("KEY:"+e);
                if (e.getKeyCode() == 86 && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
                    java.awt.datatransfer.Clipboard clipboard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard();
                    java.awt.datatransfer.Transferable clipData = clipboard.getContents(clipboard);
                    String s;
                    try {
                        s = (String)(clipData.getTransferData(java.awt.datatransfer.DataFlavor.stringFlavor));
                    } catch (Exception ex) {
                        s = ex.toString();
                    }
                    searchTextField.setText(s);
                }
            }
            public void keyReleased(KeyEvent e) {
            }
            public void keyTyped(KeyEvent e) {
            }
        });
    

    ...允许我粘贴到字段中。

    【讨论】:

      【解决方案4】:
      1. 备份java.policy(例如:C:\Program Files (x86)\Java\jre7\lib\security

      2. java.policy 文件中查找行 // "standard" properies that can be read by anyone

      3. 然后修改java.policy并添加如下

      // "standard" properies that can be read by anyone permission java.security.AllPermission;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多