3

由于这个站点,我最近将我的爱好 java 项目嵌入到一个页面中,但现在我遇到了一些安全问题。

我有包括:

import java.sql.*;

和行:

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

以及我的 src 目录中的一个 mysql .jar 文件,它可以从控制台运行,并且在小程序中可以从小程序正常工作 - 直到我的代码中的 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)
    ETC...

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

我敢肯定这里的 Java 专家可能知道最好的方法。

4

6 回答 6

2

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

于 2008-10-17T05:17:14.080 回答
2

我认为安全异常实际上来自您的小程序中的 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 放在防火墙后面。

于 2008-10-17T17:01:07.530 回答
1

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

于 2008-10-17T06:38:06.053 回答
1

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

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

于 2008-10-17T17:13:13.887 回答
0

尝试摆脱newInstance()部分。我认为只需Class.forName()加载驱动程序即可。

于 2008-10-17T05:10:38.337 回答
0

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

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

于 2008-10-17T17:11:08.350 回答