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 で (不明なソース)
    アプレットで。Database.connectDB(Database.java:80)
    等...

client.policy ファイルで修正できると思いますが、それ以外の場合は、サーバーとクライアントのネットワーク接続を使用してサーバー側からクエリを実行する抽象化レイヤーを作成する必要があるかもしれません...

ここにいるJavaの達人は、おそらくそれについての最善の方法を知っていると確信しています。

4

6 に答える 6

2

セキュリティ例外は、実際には Class.forName() の後のアプレットの System.exit() 呼び出しによるものだと思います。一般に、署名されていないアプレットで System.exit() を呼び出すことは許可されていません。これは、JVM 全体をシャットダウンするためです。行 80 が実際に Class.forName() 行であるかどうか、またはドライバーがロードされない場合に System.exit() を呼び出そうとする何らかの例外ハンドラーが行 80 にあるかどうかを確認しましたか?

とにかく、mysql jar ファイルをアプレットにロードするには、次のように ARCHIVE 属性に含める必要があります。

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

この段階を過ぎても、Web サーバーと同じ IP 番号/ホスト名で mysql サーバーをホストし、アプレットにアクセスできるすべての同じ人に公開する必要があります。トニーが言ったように、セキュリティ上の理由から、これは人々が通常行う方法ではありません。アプリケーションサーバーを制御できる場合は、サーバー側で何かを記述し、XML またはその他のデータ交換方法を使用してデータをアプレットに送信することをお勧めします。もちろん、アプレットについて学ぶためだけに実験しているのであれば、おそらく問題ありませんが、可能であれば mysql をファイアウォールの背後に置くように注意してください。

于 2008-10-17T17:01:07.530 に答える
2

アプレットから JDBC ドライバーを使用しようとしている場合、アプレットは証明書で署名されている必要があり、アプレットがクライアント側にロードされるときにサーバーがこの証明書を配信する必要があります。

于 2008-10-17T05:17:14.080 に答える
1

他の回答の 1 つ (@Leigh Caldwell) で述べたように、このようにしないことを強くお勧めします。アプレットが MySQL にアクセスできる場合は、世界中のすべての人がアクセスできます。最近の逆コンパイルは非常に些細なことであり、勤勉なハッカーがアプレットの認証情報をデータベースに取得するのはほんの一瞬の作業です。また、MySQL のユーザー/パス認証はかなり弱く、セキュリティのほとんどは IP ベースです。それを世界に開放することによって、あなたは最初の敬意を捨てることになります.

より良いアプローチは、サーバー側である種のフロントエンド プロトコルを構築することです (XMLRPC は優れた基盤であり、使いやすいでしょう)。アプレットが絶対にデータベースにアクセスする必要がある場合、メモリ内のHSQLDBが最適です。これはファイルのアクセス許可を必要とせず、完全にサンドボックス内で実行できます。ローカルのメモリ内データベースは、前述の XMLRPC ファサードを使用して、必要に応じてサーバーと同期できます。

于 2008-10-17T17:13:13.887 に答える
1

これを行うために受け入れられている方法は、アプレットのロード元のサーバーからデータの HTTP 要求を作成し、サーバーからクエリを実行することです。JSON または XML は、アプレットとサーバーの間でデータを交換するための優れた方法です (ブラウザとサーバーの間で XML または JSON を送信する AJAX アプリケーションの方法と同様です)。

于 2008-10-17T06:38:06.053 に答える
0

この例外は、アプレットがドライバ クラスをロードできなかったことを示しています。アプレットは実行時にクラスを含む jar を HTTP 経由でダウンロードする必要があるため、jar (mysql.jar またはそれが呼ばれるもの) を Web サーバーで使用できるようにする必要があります。

この問題を解決したら、ユーザーはアプレットのアクセス許可を許可して、mysql db サーバーへの TCP ソケット接続を作成できるようにする必要があります。ダイアログボックスが表示されます...

于 2008-10-17T17:11:08.350 に答える
0

その部分を取り除いてみてくださいnewInstance()Class.forName()ドライバーをロードするだけで十分だと思います。

于 2008-10-17T05:10:38.337 に答える