我最近把我的爱好java项目嵌入了一个页面感谢这个网站,但现在我遇到了一些安全问题。

我有包括:

import java.sql.*;

和行:

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

以及我的src目录中的mysql .jar文件,它可以从控制台运行,并且在applet中工作正常 - 直到我的代码中的forName()行,它会抛出异常:

    Exception: com.mysql.jdbc.Driverjava.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.-1)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkExit(Unknown Source)
    at java.lang.Runtime.exit(Unknown Source)
    at java.lang.System.exit(Unknown Source)
    at applet.Database.connectDB(Database.java:80)
    etc...

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

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

有帮助吗?

解决方案

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

无论如何,为了在applet中加载mysql jar文件,你需要将它包含在这样的ARCHIVE属性中:

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

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

其他提示

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

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

正如其他一个答案(@Leigh Caldwell)中提到的那样,我强烈建议不要这样做。如果您的applet可以访问MySQL,那么世界上的其他人也是如此。如今,反编译是如此微不足道,以至于只有一个勤劳的黑客才能将applet凭据提供给数据库。此外,MySQL的用户/通过身份验证相当薄弱,其大部分安全性都是基于IP的。通过向世界开放,你就会抛弃你的第一线。

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

尝试删除 newInstance()部分。我想只需要 Class.forName()来加载驱动程序。

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

解决此问题后,用户必须允许applet权限,以便它可以与mysql数据库服务器建立TCP套接字连接。他们会出现一个对话框...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top