【问题标题】:How do I permit my Java applet to use MySQL?如何允许我的 Java 小程序使用 MySQL?
【发布时间】:2010-09-17 16:30:13
【问题描述】:

我最近将我的爱好 java 项目嵌入到页面 thanks to this very site,但现在我遇到了一些安全问题。

我有包括:

import java.sql.*;

还有一行:

Class.forName("com.mysql.jdbc.Driver").newInstance();

除了我的 src 目录中的 mysql .jar 文件外,它还可以在控制台上运行,并且在 applet 中可以在 applet 中正常运行 - 直到我的代码中的 forName() 行,它会抛出异常: 异常:com.mysql.jdbc.Driverjava.lang.ClassNotFoundException:com.mysql.jdbc.Driver java.security.AccessControlException:访问被拒绝(java.lang.RuntimePermission exitVM.-1) 在 java.security.AccessControlContext.checkPermission(未知来源) 在 java.security.AccessController.checkPermission(未知来源) 在 java.lang.SecurityManager.checkPermission(未知来源) 在 java.lang.SecurityManager.checkExit(未知来源) 在 java.lang.Runtime.exit(未知来源) 在 java.lang.System.exit(未知来源) 在 applet.Database.connectDB(Database.java:80) 等等...

我想我可以用 client.policy 文件修复它,否则我可能需要编写一个抽象层,它使用服务器-客户端网络连接从服务器端查询...

我相信这里的 Java 大师可能知道最好的方法。

【问题讨论】:

    标签: java mysql security applet


    【解决方案1】:

    我认为安全异常实际上来自您的小程序中的 System.exit() 调用,在 Class.forName() 之后。通常,您不允许在未签名的小程序中调用 System.exit(),因为它会关闭整个 JVM。您是否检查过第 80 行是否实际上是 Class.forName() 行,或者第 80 行是否有某种异常处理程序,如果驱动程序未加载,它会尝试调用 System.exit()?

    无论如何,为了在你的小程序中加载 mysql jar 文件,你需要将它包含在一个 ARCHIVE 属性中,如下所示:

    <APPLET ARCHIVE="mysql.jar" CODEBASE="./src/" ...
    

    一旦你过了这个阶段,你仍然需要将 mysql 服务器托管在与 web 服务器相同的 IP 号/主机名上,并向所有可以访问你的 applet 的人开放它。正如托尼所说,出于安全原因,人们通常不会这样做。最好在服务器端写一些东西,如果你可以控制应用服务器,并使用 XML 或其他一些数据交换方法将数据输出到小程序。当然,如果您只是尝试学习小程序,那可能没问题 - 但如果可能,请注意将 mysql 放在防火墙后面。

    【讨论】:

    • 将这个属性添加到 HTML 标签中效果很好!谢谢!感谢所有警告过通过反编译获取身份验证详细信息是多么容易的人,我认为这可能是一个问题,在公开应用程序之前,我将使用网络协议并执行所有 SQL 服务器端。
    【解决方案2】:

    如果您尝试使用小程序中的 JDBC 驱动程序,则小程序需要使用证书进行签名,并且您的服务器需要在小程序加载到客户端时交付此证书。

    【讨论】:

      【解决方案3】:

      执行此操作的公认方法是从加载小程序的服务器发出 HTTP 请求数据,并从服务器运行查询。 JSON 或 XML 是在 applet 和服务器之间交换数据的好方法(类似于执行 AJAX 应用程序的方式,在浏览器和服务器之间发送 XML 或 JSON)。

      【讨论】:

        【解决方案4】:

        正如在其他答案之一 (@Leigh Caldwell) 中提到的,我强烈建议不要以这种方式做事。如果您的小程序可以访问 MySQL,那么世界上其他所有人也可以访问 MySQL。如今,反编译是如此微不足道,以至于对于一个勤劳的黑客来说,只需片刻的工作就可以将 applet 凭证获取到数据库中。此外,MySQL 的用户/通行证身份验证相当薄弱,其大部分安全性是基于 IP 的。通过向世界开放它,你正在抛弃你的第一道顺从。

        更好的方法是在服务器端构建某种前端协议(XMLRPC 将是一个很好的基础并且易于使用)。如果小程序绝对需要访问数据库,最好的选择是内存中的HSQLDB。这不需要任何文件权限,并且可以完全在沙箱中运行。本地内存数据库可以根据需要使用前面提到的 XMLRPC 外观与服务器同步。

        【讨论】:

          【解决方案5】:

          尝试去掉 newInstance() 部分。我认为只有 Class.forName() 可以加载驱动程序。

          【讨论】:

          • 你说得对,我不需要那个位。但它仍然无法在嵌入式小程序中工作。同样的问题。
          【解决方案6】:

          异常告诉你小程序已经无法加载驱动类。您的小程序需要在运行时通过 HTTP 下载包含该类的 jar,因此您必须在网络服务器上提供该 jar(mysql.jar 或其他名称)。

          一旦你解决了这个问题,用户将必须允许小程序权限,以便它可以与 mysql 数据库服务器建立 TCP 套接字连接。他们将通过一个对话框提示...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-03
            • 2013-10-24
            • 2013-01-24
            • 2011-02-13
            • 2012-10-21
            • 2012-06-02
            • 2013-12-09
            • 2023-03-30
            相关资源
            最近更新 更多