Sono uno sviluppatore del motore Robocode. Vorremmo rendere Robocode multilingue e Scala sembra essere una buona partita. Abbiamo il plugin Scala prototype here.Sicurezza di runtime scala
Il problema: Poiché gli utenti sono programmatori creativi, possono provare a vincere la battaglia modi diversi. Inoltre, i robot vengono scaricati dal database online in cui chiunque può caricarne uno. Quindi la mancanza di sicurezza può portare al buco di sicurezza nel computer degli utenti. I robot scritti in Java sono in esecuzione nella sandbox limitata . Quasi tutto è vietato [rete, interfaccia grafica, disco (limitato), thread (limitato), classloader e riflessione]. La sandbox è simile all'applet del browser. Usiamo SecurityManager, personalizzato ClassLoader per robot, etc ...
Ci sono due modi come ospitare Scala runtime in Robocode:
1) caricarlo insieme ai robot all'interno della sandbox. Piuttosto sicuro per noi, soluzione preferita . Ma danneggerà le abilità di runtime di Scala perché il runtime usa la riflessione. Forse genera classi in fase di runtime? Utilizzare i thread per eseguire una pulizia interna? Accesso a JVM/interni? (Non vorrei limitare le capacità del linguaggio)
2) utilizzare il runtime di Scala come codice attendibile, fuori dagli schemi, sicurezza su allo stesso livello di JDK. Visibilità al robot (dannoso) . Le API di runtime di Scala sono sicure? I metodi hanno le protezioni di sicurezza ? Esiste una modalità sicura? C'è qualche singleton nel runtime di Scala, che potrebbe essere abusato per comunicare tra i robot? Qualsiasi concurrency/threadpool/messaging che potrebbe simulare i thread? (Esiste un controllo di sicurezza per il runtime di Scala?)
3) Qualcosa nel mezzo, alcune classi di runtime dentro e alcune fuori. Quali classi/pacchetti devono essere visibili al robot/che sono solo un'implementazione privata? (Questa sembra essere la soluzione futura)
La domanda: E 'possibile enumerare e isolare le parti del tempo di esecuzione, che deve essere eseguito in portata di fiducia dal resto? Pacchetti e classi specifici? O un'idea migliore?
Sto cercando una risposta specifica, che porterà a una soluzione sicura. Pensieri casuali benvenuti, ma non assegnati. Sono in corso discussioni allo scala email group. Nessuna risposta specifica ancora.
Link al thread su riflessione e array: http://thread.gmane.org/gmane.comp.lang.scala.internals/2590 –
Diversi buoni punti qui. Per quanto riguarda l'obiettivo in movimento, giusto, sono felice di bloccare la singola versione di scala. Per quanto riguarda "Aha! Userò la riflessione per risolvere questo". questo è un atto criminale. Non mi piacerebbe vedere i miei utenti/neofiti lamentarsi presso il nostro gruppo di supporto su runtime interrotto che non possediamo. Non mi è chiaro se il runtime avvolgerà/convertirà l'eccezione in qualcosa di coerente. Almeno AccessController.doPrivileged() per tali azioni? –
Devi considerare gli obiettivi di mercato Scala. La riflessione è praticamente onnipresente nei framework web Java e nei linguaggi dinamici basati su JVM. È piuttosto minore rispetto alla manipolazione bytecode di runtime, che è anche comune. Inoltre, tenere presente che l'uso della riflessione non è necessariamente limitato al runtime o alla libreria, di per sé, ma piuttosto che il compilatore emette semplicemente chiamate all'interno del normale codice utente. Non riesco a trovare una singola istanza di AccessController nell'origine Scala, quindi non credo che sia a conoscenza di tali cose. –