Pro*_*ead 11 javascript java security applet liveconnect
我在位于http:// localhost:8080/index.html的简单HTML页面上插入了一个Java Applet :
<applet id="applet" code="SomeCode.class" archive="lib.jar" Width="1" Height="1"></applet>
Run Code Online (Sandbox Code Playgroud)
Java Applet有一个类似于下面代码的方法:
public void PostStuffToServer() {
String server = "http://localhost:8080/PostHandler.ashx";
URL u = new URL(server);
URLConnection con = u.openConnection();
con.setDoOutput(true);
con.getOutputStream().write(stream.toByteArray());
con.connect();
}
Run Code Online (Sandbox Code Playgroud)
当我从JavaScript执行applet代码时,如下所示:
obj = document.getElementById('applet');
obj.getClipboardImageURL();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
访问被拒绝(java.net.SocketPermission 127.0.0.1:8080 connect,resolve)
似乎Java代码将域localhost解析为其等效的IP地址,因此引发了跨域安全限制.当我从http://127.0.0.1:8080/index.html执行相同的代码时,它工作正常.lib.jar文件已签名.
反正有没有避免这个?
Kri*_*ian 14
我遇到同样的问题安装Java 6更新22.我的小程序后,已经上线了好几年,没有报告的错误.当我降级到版本6更新21时,一切都很完美.我的applet没有签名.
解决方案:找到问题的原因我花了很多时间.实际上在我的情况下,有几个因素导致安全错误.该问题已通过crossdomain.xml文件解决.Java小程序试图下载跨域文件,失败,甚至没有理会在java控制台(调试级别5)显示错误.Java的试图从我的域名的IP地址下载文件(HTTP://ip-address/crossdomain.xml),而不是我的网站的根目录(HTTP://domain-name/crossdomain.xml).我想这对安全方面更好?然后,我必须配置Web服务器以在IP地址上公开crossdomainfile.在我的情况下,出于安全原因,我已经删除了ISS中的默认网站,并且必须创建一个新网站.然后我发现java applet不适用于我用flash的crossdomain文件:
<?xml version="1.0"?>
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-http-request-headers-from domain="*" headers="*"/>
<allow-access-from domain="*" />
</cross-domain-policy>
Run Code Online (Sandbox Code Playgroud)
我不得不删除现场控制和允许-HTTP请求报头,从为了使小程序工作从XML文件中的节点.
小智 10
我想我已经太晚了,但无论如何......你不能相信这个问题解决方案有多容易.
问题是从JavaScript调用的Java applet代码只具有JavaScript代码和applet代码交集的权限 - 并且不知何故JavaScript的权限被视为较少,这导致了此异常.
这是我做的:假设你有一个innocentFunc()抛出java.net.SocketPermission异常的函数,所以你的代码是这样的:
String s = innocentFunc();
Run Code Online (Sandbox Code Playgroud)
现在您可以做的是将其更改为:
String s = AccessController.doPrivileged(
new PrivilegedAction<String>() {
public String run() {
return innocentFunc();
}
}
);
Run Code Online (Sandbox Code Playgroud)
此AccessController调用基本上向Java虚拟机声明它运行的代码不应服从调用链的权限,而应仅服从调用者自己的权限.
当然,只有在确保此innocentFunc调用无法执行任何错误操作之后,即使被恶意代码调用,您也应该执行此类操作.
| 归档时间: |
|
| 查看次数: |
76815 次 |
| 最近记录: |