我们正在使用部署在自助服务终端类型环境中的Firefox 18.0.1来运行已签名的小程序。 JDK和JRE都是JavaSE 7u11。签名的jar允许我们完成沙盒applet通常无法为其用户做的所有事情(漫游本地磁盘,与打印机交谈,窃取所有pr0n等)。
applet和加载它的页面共同生成一些HTML和JavaScript;然后,JavaScript和applet以大多数无缝的方式来回交谈。有时applet会创建弹出对话框;这些是由用户点击Java组件触发的,或者是由用户点击某个带有" onclick"告诉applet进行对话的脚本。
在上周,我发现了一些applet的弹出对话框。他们在对话框中悬挂 的小警告图标:
如果用户移动图标,则图标会粘贴到对话框中。将鼠标悬停在图标上会弹出一点“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.
}
}
我花了大约一个小时与谷歌抱抱,希望它可能会向我揭示一些东西,但我无法在那里找到任何提及。这是Firefox的东西还是JRE的东西?或者,更好的问题:是什么导致警告图标出现在某些对话框而不是其他对话框上?
答案 0 :(得分:1)
直接从用户点击已签名的applet小部件触发的弹出窗口是“正常的”。
用户点击HTML / JavaScript对象触发的弹出窗口,以及调用签名Java函数的“onclick”脚本会被标记为警告。
只要javascript函数调用签名的applet,applet就会被视为无符号的调用长度。这可能是类似的预防措施生效,但我实际上并没有证实这一点。在这两种情况下,解决方案都是相同的:找到最小代码段,需要“没有真正安全,我的意思是”状态,并在其周围包裹PrivilegedExceptionAction
。或者至少,这是其他javascript-to-signed-applet调用的正确解决方案,所以我在这里尝试了它并且它有效。 : - )
在我们的实际代码中,显示对话框的部分(从createDialog
开始)是在它自己的函数中。用AccessController.doPrivileged()
替换对该函数的调用以及对该函数的包装调用可以处理所有事情。没有警告图标!