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

时间:2010-11-09 15:06:06

标签: java javascript 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>

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文件已签名。

无论如何都要避免这种情况吗?

10 个答案:

答案 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

访问它