访问被拒绝(java.net.SocketPermission 127.0.0.1:8080 connect,resolve)

我在位于http:// localhost:8080 / index.html的简单HTML页面上插入了一个Java 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文件已签名。

反正有没有避免这个?

我在安装Java 6 Update 22后遇到了同样的问题。我的applet已连续几年没有报告错误。 当我降级到版本6更新21时,一切都很完美。 我的小程序没有签名。

解决方案:找到问题的原因我花了很多时间。 实际上,在我的情况下,有几个因素导致安全错误。 该问题已通过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文件中的节点中删除site-control和allow-http-request-headers,以使applet工作。

我想我已经太迟了,但无论如何……你不能相信这个问题解决方案有多容易。

问题是从JavaScript调用的Java applet代码只具有JavaScript代码和applet代码交集的权限 – 不知何时,JavaScript的权限被视为较少,这导致了此exception。

这是我做的:假设你有一个函数innocentFunc()抛出java.net.SocketPermissionexception,所以你的代码是这样的:

 String s = innocentFunc(); 

现在您可以做的是将其更改为:

 String s = AccessController.doPrivileged( new PrivilegedAction() { public String run() { return innocentFunc(); } } ); 

此AccessController调用基本上向Java虚拟机声明它运行的代码不应服从来自调用链的权限,而应仅服从调用者自己的权限。

当然,只有在确保这个innocentFunc调用不能做任何坏事之后,即使被恶意代码调用,你也应该这样做。

只是补充一下,这里有一些东西与我遇到的问题完全匹配 – 它特别提到用JavaScript控制applet。

http://www.oracle.com/technetwork/java/javase/6u22releasenotes-176121.html

CVE-2010-3560的修复程序可能会导致在新Java插件中运行的某些Java小程序停止工作,如果它们嵌入到包含调用Java的JavaScript以执行需要网络安全权限的操作的网页中。 如果解析原始网页URL主机名的名称服务未返回匹配的名称作为反向地址查找的结果,则在某些情况下,这些小程序可能会因网络安全exception而失败。

他们的建议是在DNS中添加一个特殊的疯狂的Java-A记录,如:

 10.11.12.13 foo.bar.com.auth.13.12.11.10.in-addr.arpa 

我在Update 22中得到了同样的东西,而不是Update 21。

我正在使用TinyPlayer applet,我通过JavaScript控制它。

我正在加载来自同一域(mydomain.example.com,IP 1.2.3.4)的音频文件作为applet加载的页面 – 所有内容都是使用相对URL引用的。

当我尝试播放音频时,它无法播放,我得到:访问被拒绝(java.net.SocketPermission 1.2.3.4:80 connect,resolve)

查看访问日志,在此之前我收到了对crossdomain.xml的请求。 但问题是Java不是要求mydomain.example.com/crossdomain.xml中的crossdomain.xml …而是来自1.2.3.4/crossdomain.xml

似乎对我有用的解决方法是设置响应IP地址1.2.3.4的虚拟主机,并为其提供一个crossdomain.xml,以便Java可以在(错误的)位置找到它的crossdomain.xml。寻找它。

我刚刚测试了内容:

      

……但可能会使这种限制更具限制性。

有了它,音频播放正确。

IIRC,JavaScript同源策略阻止访问同一主机/不同端口。 PlugIn的LiveConnect仅对localhost强制实施此策略。

请参阅: http : //download.oracle.com/javase/tutorial/deployment/applet/security.html

未签名的小程序可以执行以下操作:

他们可以与他们来自的主机建立网络连接。

如果Java没有将原始系统解析为localhost,那么applet将无法打开套接字。

我有类似的问题,它只发生在我使用“localhost”作为带有applet的页面的URL的一部分时。 当我使用具有实际主机名或IP地址的URL作为URL的一部分时,问题没有发生。 我不确定这是Java插件的缺陷……

例如,当我使用http:// localhost:9080 / app_id / appletPage这样的URL时出现了问题,但是当我使用实际的IP或主机名来使用URL时,问题没有发生。

我认为不可能使crossdomain.xml文件更具限制性,目前Java applets只支持(domain =“*”)

请参阅http://www.oracle.com/technetwork/java/javase/index-135519.html#CROSSDOMAINXML

您应该检查您的虚拟目录权限。

来自@Kristian的更新保存了我的一天。

我从Web应用程序中的applet access denied (java.net.SocketPermission : connect,resolve)

我们的DNS发生了变化,因此应用程序服务器的负载均衡器的IP未解析为具有域的名称。 因此,从applet回到服务器的可疑“跨域连接”被阻止。 我添加了crossdomain.xml

/webapps并检查它是否可以通过http://:/crossdomain.xml