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

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)

我不得不删除现场控制和允许-H​​TTP请求报头,从为了使小程序工作从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调用无法执行任何错误操作之后,即使被恶意代码调用,您也应该执行此类操作.