2

我们使用部署在信息亭类型环境中的 Firefox 18.0.1 来运行签名的小程序。JDK 和 JRE 都是 JavaSE 7u11。签名的 jar 让我们可以完成沙盒小程序通常无法为其用户做的所有事情(漫游本地磁盘、与打印机通信、窃取他们的所有 pr0n 等)。

小程序和加载它的页面共同生成一些 HTML 和 JavaScript;然后 JavaScript 和小程序以一种几乎无缝的方式来回交谈。有时小程序会创建弹出对话框;这些要么由用户单击 Java 组件触发,要么由用户单击某些带有“onclick”脚本的 HTML 小部件触发,该脚本告诉小程序进行对话。

在上周,我注意到一些小程序的弹出对话框有些奇怪。他们在对话框外挂着一个小警告图标:

小小的砰砰

如果用户移动它,该图标将粘在对话框上。将鼠标悬停在图标上会弹出一个小的“Java Applet Window”工具​​提示,这特别有趣,因为并非我们所有的对话框都与它一起出现。

该快照中显示的窗口是使用此测试代码创建的。(是的,使用 JOptionPane 有更短的方法,但它不会复制我们的实际代码。一些对话框比其他对话框更定制。)

import java.awt.BorderLayout;

import javax.swing.JApplet;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class WhereTheHellDoesTheIconComeFrom
{
    private JPanel topPanel;

    public WhereTheHellDoesTheIconComeFrom (JApplet applet) {
        // Multiple panels with a text blob in each
        JLabel exampleText = new JLabel ("some text here", JLabel.CENTER);
        topPanel = new JPanel (new BorderLayout(5,0));
        topPanel.add (exampleText, BorderLayout.CENTER);

        // Create the options pane.
        Object allpanels[] = new Object[] {
            topPanel,
        };
        Object buttons[] = { "B1", "B2" };

        JOptionPane optionPane = new JOptionPane (allpanels,
            JOptionPane.PLAIN_MESSAGE,
            JOptionPane.OK_CANCEL_OPTION,
            null,   // no icon built in
            buttons,
            buttons[0]);  // select this button by default

        // Ask it for the visible popup.
        JDialog dialog = optionPane.createDialog(
            SwingUtilities.getWindowAncestor(applet),
            "This is the title text");
        dialog.setResizable(false);
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
        // Modal dialog blocks on the previous line; at this point I can
        // examine getValue() and make decisions, etc, etc.
    }
}

我花了大约一个小时与 Google 相处,希望它能向我揭示一些东西,但我找不到任何关于此的提及。这是 Firefox 的事情还是 JRE 的事情?或者,更好的问题:是什么导致警告图标出现在某些对话框而不是其他对话框上?

4

1 回答 1

1

嗯,现在我觉得很傻。我已经玩了几个小时了,一无所获,在这里发布了问题,去拿了我的第 14 杯咖啡,然后在搅拌奶油的同时得到了答案。区别如下:

用户单击签名的小程序小部件直接触​​发的弹出窗口是“正常的”。

用户单击 HTML/JavaScript 对象触发的弹出窗口以及调用已签名 Java 函数的“onclick”脚本会被标记为警告。

每当 javascript 函数调用已签名的小程序时,该小程序在调用期间被视为未签名。这可能是一个类似的预防措施生效,但我还没有真正证实这一点。在这两种情况下,解决方案都是相同的:找到需要“不,这是安全的,我是认真的”状态的最小PrivilegedExceptionAction代码段,然后将其包裹起来。或者至少,这是其他 javascript-into-signed-applet 调用的正确解决方案,所以我在这里尝试了它并且它有效。:-)

在我们的真实代码中,显示对话框的部分(从createDialog后面)在它自己的函数中。用对该函数的调用替换对该函数的调用并对该函数进行AccessController.doPrivileged()包装调用可以处理所有事情。不再有警告图标!

于 2013-01-22T23:25:49.727 回答