我在位于http://localhost:8080/index.html的简单HTML页面上插入了一个Java Applet:
<applet id="applet" code="SomeCode.class" archive="lib.jar" Width="1" Height="1"></applet>
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();
}
当我从JavaScript执行applet代码时:
obj = document.getElementById('applet');
obj.getClipboardImageURL();
我收到以下错误:
访问被拒绝(java.net.SocketPermission 127.0.0.1:8080 connect,resolve)
似乎Java代码将域 localhost 解析为其等效的IP地址,因此引发了跨域安全限制。当我从http://127.0.0.1:8080/index.html执行相同的代码时,它工作正常。 lib.jar文件已签名。
无论如何都要避免这种情况吗?
答案 0 :(得分:14)
我在安装Java 6 Update 22后遇到了同样的问题。我的applet已连接多年,没有报告错误。当我降级到版本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的交叉域文件:
<?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>
我不得不从xml文件中的节点中删除site-control和allow-http-request-headers,以使applet正常工作。
答案 1 :(得分:10)
我想我已经太晚了,但无论如何......你们不能相信这个问题有多么容易解决。
问题在于,从JavaScript调用的Java applet代码只具有JavaScript代码和applet代码交集的权限 - 并且不知何故JavaScript的权限被视为较少,这导致了此异常。
这就是我所做的:假设你有一个抛出java.net.SocketPermission异常的函数innocentFunc()
,所以你的代码是这样的:
String s = innocentFunc();
现在你能做的就是把它改成这样的东西:
String s = AccessController.doPrivileged(
new PrivilegedAction<String>() {
public String run() {
return innocentFunc();
}
}
);
这个AccessController调用基本上向Java虚拟机说明它运行的代码不应该服从来自调用链的权限,而应该只服从调用者的权限。
当然,只有在确保此innocentFunc
调用无法执行任何错误操作后,即使被恶意代码调用,您也应该执行此类操作。
答案 2 :(得分:2)
我对Update 22采用了相同的功能,而不是更新21.
我正在使用TinyPlayer小程序,我正在通过JavaScript控制它。
我正在加载来自同一域(mydomain.example.com,IP 1.2.3.4)的音频文件作为applet加载的页面 - 所有内容都是使用相对URL引用的。
当我尝试播放音频时,它无法播放,我得到: 访问被拒绝(java.net.SocketPermission 1.2.3.4:80 connect,resolve)
查看访问日志,在此之前我收到了对crossdomain.xml的请求。但问题是Java并没有要求使用crossdomain.xml mydomain.example.com/crossdomain.xml ......而是来自 1.2.3.4/crossdomain.xml
对我来说似乎有用的解决方法是设置一个响应IP地址1.2.3.4的虚拟主机,并给它一个crossdomain.xml,以便Java可以在(错误的)中找到crossdomain.xml它正在寻找它。
我刚刚测试了内容:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
...但是可能会使这种限制性更强。
在那里,音频播放正确。
答案 3 :(得分:2)
只是补充说,这里有一些东西与我一直在讨论的问题完全匹配 - 它特别提到用JavaScript控制applet。
http://www.oracle.com/technetwork/java/javase/6u22releasenotes-176121.html
CVE-2010-3560的修复可能会导致 某些Java小程序在中运行 如果新的Java插件停止工作 它们嵌入在网页中 包含调用的JavaScript Java为了执行哪些操作 需要网络安全权限。 这些小程序可能会因网络而失败 一些安全例外 如果名称服务的情况 这解决了原始网页 URL主机名不返回 匹配名称作为结果 反向地址查找。
他们的建议是在DNS中添加一个特殊的疯狂的Java-A记录,如:
10.11.12.13 foo.bar.com.auth.13.12.11.10.in-addr.arpa
答案 4 :(得分:1)
IIRC,JavaScript同源策略阻止访问同一主机/不同端口。 PlugIn的LiveConnect仅对localhost强制执行此策略。
答案 5 :(得分:1)
请参阅:http://download.oracle.com/javase/tutorial/deployment/applet/security.html
未签名的小程序可以执行以下操作:
他们可以与他们来自的主机建立网络连接。
如果Java没有将原始系统解析为localhost,那么applet将无法打开套接字。
答案 6 :(得分:1)
我遇到了类似的问题,只有当我使用“localhost”作为带有applet的页面的URL的一部分时才会出现这种情况。当我使用具有实际主机名或IP地址的URL作为URL的一部分时,问题没有发生。我不确定这是Java插件的缺陷......
例如,当我使用像http://localhost:9080/app_id/appletPage这样的网址时出现了问题,但是当我使用实际的IP或主机名来使用URL时,问题没有发生。
答案 7 :(得分:0)
我认为不可能使crossdomain.xml文件更具限制性,目前Java applet只支持(domain =“*”)
见http://www.oracle.com/technetwork/java/javase/index-135519.html#CROSSDOMAINXML
答案 8 :(得分:0)
您应该检查您的虚拟目录权限。
答案 9 :(得分:0)
从@Kristian更新以上节省了我的一天。
我从网络应用程序中的applet获得了access denied (java.net.SocketPermission <server_ip>:<server port> connect,resolve)
。
我们的DNS发生了变化,因此应用程序服务器的负载均衡器的IP未解析为具有域的名称。因此,从applet返回到服务器的可疑“跨域连接”被阻止。 我添加了带有
的crossdomain.xml <?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
到<tomcat-home>/webapps
并检查可以使用http://<server name>:<server port>/crossdomain.xml