【问题标题】:Java Applet with jar embed in HTML security issue带有 jar 嵌入 HTML 安全问题的 Java Applet
【发布时间】:2013-02-26 02:53:56
【问题描述】:

我在 HTML 页面中嵌入了一个小程序。该小程序还使用 MySQL jar 文件。

没有 MySQL jar 文件也可以正常工作。从本地网络服务器或托管网络服务器执行它时,会出现以下错误:

Exception in thread "AWT-EventQueue-2" java.lang.ExceptionInInitializerError
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:286)
at java.sql.DriverManager.getConnection(Unknown Source)
.........
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "file.encoding" "read")
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)

我的文件列表:

/appletTest.html
/mysql-connector-java-5.1.18-bin.jar
/applet/testApplet.class

testApplet.class:

package applet;

import java.applet.Applet;
import java.awt.Graphics;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class HelloWorldApplet extends Applet {

@Override
public void paint(Graphics g) {
    g.drawString("Hello World", 25, 50);

    Connection con = null;
    Statement st = null;
    ResultSet rs = null;

    String url = "jdbc:mysql://localhost:3306/testdb";

    try {
        con = DriverManager.getConnection(url, "root", ""); // <= here fails
        st = con.createStatement();
        rs = st.executeQuery("SELECT VERSION()");

        if (rs.next()) {
            g.drawString(rs.getString(1), 25, 50);
        }

    } catch (SQLException ex) {
        System.out.println(ex);
    } 
  }
}

appletTest.html:

<html>
  <head>
  <title>Applet Test</title>
  </head>
   <body>
      <applet code="applet.testApplet.class" width="500" height="300" archive="mysql-connector-java-5.1.18-bin.jar">
      </applet>
   </body>
</html>

我认为出现此安全错误是因为小程序无法访问本地资源,除非您“签名”或“更改本地安全策略”。但是我所有的文件都位于网络服务器上,而小程序请求的 jar 文件也位于网络服务器上。

所以,我在这里没有看到本地文件请求,但仍然收到此错误。你能给我一些建议吗?

【问题讨论】:

    标签: java applet japplet


    【解决方案1】:

    "Ordinarily, unsigned Java applets or applications may only connect back to the web server from which they originated. This restriction prevents an applet from causing denial-of-service attacks by making rapid connections to arbitrary machines on the Internet."

    当您进行测试时,请确保您与网络服务器位于同一个域中。 file:///.../appletTest.html 即使你访问 localhost 也不起作用。

    该行:String url = "jdbc:mysql://localhost:3306/testdb"; 需要更改为您的网络服务器的地址。

    [编辑] 每次调用paint() 时都打开一个新连接不是很傻吗?

    [编辑] 我更仔细地阅读了你的帖子。问题是您无法访问 jar 文件。最简单的方法是将驱动程序打包在与小程序相同的 jar 中。

    【讨论】:

    • @JeanP 在这种情况下,我认为 url 并不重要,因为它在加载之前会失败,但感谢您指出它。我也尝试过更改它,但这也没有奏效。
    • @JeanP PS:paint() 方法和所有编码只是一个示例;)
    • @JeanP 我已经将库和类打包在同一个 jar 中。删除了所有文件。我现在有两个文件“applet/test.jar”和“appletTest.html”。它仍然给出相同的错误。我当前的 html 代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多