Sto lavorando a un progetto che ha host e client e dove gli host possono inviare comandi ai client (tramite socket).Quali problemi di sicurezza derivano dal chiamare i metodi con la riflessione?
Sono determinato che l'utilizzo di JSON per comunicare le opere migliori.
Ad esempio:
{
"method" : "toasty",
"params" : ["hello world", true]
}
In questo esempio, quando questa stringa JSON viene inviato al client, verrà elaborato e un metodo appropriato all'interno del client verrà eseguito come tale:
public abstract class ClientProcessor {
public abstract void toasty(String s, boolean bool);
public abstract void shutdown(int timer);
private Method[] methods = getClass().getDeclaredMethods();
public void process(String data) {
try {
JSONObject json = new JSONObject(data);
String methodName = (String) json.get("method");
if (methodName.equals("process"))
return;
for (int i = 0; i < methods.length; i++)
if (methods[i].getName().equals(methodName)) {
JSONArray arr = json.getJSONArray("params");
int length = arr.length();
Object[] args = new Object[length];
for (int i2 = 0; i2 < length; i2++)
args[i2] = arr.get(i2);
methods[i].invoke(this, args);
return;
}
} catch (Exception e) {}
}
}
E utilizzando il ClientProcessor:
public class Client extends ClientProcessor {
@Override
public void toasty(String s, boolean bool) {
//make toast here
}
@Override
public void shutdown(int timer) {
//shutdown system within timer
}
public void processJSON(String json) {
process(json);
}
}
il JSON viene inviato dal server al client , ma il server potrebbe essere modificato per inviare JSON diversi.
Le mie domande sono:
- È questo un modo sicuro di eseguire metodi di elaborazione JSON?
- C'è un modo migliore per farlo? Sto pensando che l'uso della riflessione sia terribilmente lento.
Combina questo approccio con la generazione del codice e otterrai una soluzione rapida, sicura e conveniente (+1) –
@DmitryZaitsev yeah, ci sono alcune API che posso pensare (Spring e J2EE) che essenzialmente fanno ciò che ho mostrato (normalmente con annotazioni in questi giorni), quale sarebbe la mia scelta piuttosto che rotolare il mio –
Stai parlando di 'Object.wait()'? Sto usando '.getDeclaredMethods();' che restituirà solo 'toasty',' shutdown' e 'process'. Nel metodo 'process', ignoro le richieste di metodo da elaborare (per evitare uno stackoverflow). Preferisco di gran lunga la tua idea. –