Domanda

Di recente ho ottenuto il mio progetto java per hobby incorporato in una pagina grazie proprio a questo sito , ma ora sto riscontrando alcuni problemi di sicurezza.

Ho incluso:

import java.sql.*;

e la riga:

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

oltre a un file mysql .jar nella mia directory src, funziona dalla console e nell'applet funziona bene dall'applet - fino alla riga forName () nel mio codice, dove genera l'eccezione:

    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...

Penso che potrei essere in grado di risolverlo con un file client.policy, altrimenti potrei aver bisogno di scrivere un livello di astrazione che utilizza una connessione di rete server-client per eseguire query dal lato server ...

Sono sicuro che i guru di Java qui probabilmente conoscono il modo migliore al riguardo.

È stato utile?

Soluzione

Penso che l'eccezione di sicurezza provenga effettivamente da una chiamata System.exit () nell'applet, dopo Class.forName (). Generalmente non è consentito chiamare System.exit () in applet senza segno in quanto interrompe l'intera JVM. Hai verificato se la riga 80 è effettivamente la riga Class.forName () o la riga 80 ha un qualche tipo di gestore delle eccezioni che tenta di chiamare System.exit () se il driver non viene caricato?

Ad ogni modo, per caricare il file mysql jar nell'applet, è necessario includerlo in un attributo ARCHIVE come questo:

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

Una volta superato questo passaggio, dovrai comunque ospitare il server mysql con lo stesso numero IP / nome host del server web e aprirlo a tutte le stesse persone che possono accedere all'applet. Come ha detto Tony, non è così che la gente lo fa normalmente, per motivi di sicurezza. Meglio scrivere qualcosa sul lato server, se si ha il controllo del server delle app e utilizzare XML o altri metodi di scambio di dati per trasferire i dati all'applet. Ovviamente se stai solo sperimentando informazioni sulle applet, probabilmente va bene, ma fai attenzione a mantenere mysql dietro il tuo firewall, se possibile.

Altri suggerimenti

Se si sta tentando di utilizzare un driver JDBC dall'applet, l'applet deve essere firmata con un certificato e il server deve consegnare questo certificato quando l'applet viene caricato sul lato client.

Il modo accettato per fare ciò è di effettuare richieste HTTP per i dati dal server da cui è stata caricata l'applet ed eseguire le query dal server. JSON o XML sono buoni modi per scambiare dati tra l'applet e il server (simile al modo in cui si esegue un'applicazione AJAX, inviando XML o JSON tra il browser e il server).

Come menzionato in una delle altre risposte (@Leigh Caldwell), fortemente consiglio di non fare le cose in questo modo. Se la tua applet ha accesso a MySQL, lo stesso vale per tutti gli altri nel mondo. La decompilazione è così banale in questi giorni che sarebbe solo un momento di lavoro per un hacker operoso ottenere le credenziali dell'applet nel database. Inoltre, l'autenticazione utente / pass di MySQL è piuttosto debole, la maggior parte della sua sicurezza è basata su IP. Aprendolo al mondo, stai gettando via la tua prima linea di rispetto.

Un approccio migliore sarebbe quello di costruire una sorta di protocollo frontend sul lato server (XMLRPC sarebbe una buona base e facile da usare). Se l'applet ha assolutamente bisogno di accedere a un database, la tua scommessa migliore sarebbe HSQLDB in memoria. Ciò non richiede autorizzazioni per i file e può essere eseguito completamente nella sandbox. Il database locale nella memoria potrebbe essere sincronizzato con il server, se necessario, utilizzando la suddetta facciata XMLRPC.

Prova a sbarazzarti della parte newInstance () . Penso che solo il Class.forName () lo faccia per caricare il driver.

L'eccezione indica che l'applet non è stata in grado di caricare la classe di driver. L'applet deve scaricare il jar contenente la classe in fase di runtime, tramite HTTP, quindi è necessario disporre del jar (mysql.jar o come viene chiamato) disponibile sul server web.

Dopo aver risolto questo problema, l'utente dovrà consentire le autorizzazioni dell'applet in modo che possa stabilire una connessione socket TCP al server mysql db. Verrà richiesto con una finestra di dialogo ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top