Ich bin Entwickler von Robocode Motor. Wir möchten Robocode mehrsprachig machen und Scala scheint gut zu sein. Wir haben Scala-Plugin prototype here.Sicherheit der Scala Laufzeit
Das Problem: Da Benutzer kreative Programmierer sind, können sie versuchen, Kampf verschiedene Möglichkeiten, um zu gewinnen. Außerdem werden Roboter aus der Online-Datenbank heruntergeladen, wo jeder eine hochladen kann. So Lücke in Sicherheit kann zu Sicherheit Loch in Benutzer Computer führen. In Java geschriebene Roboter laufen in eingeschränkter Sandbox. Fast alles ist verboten [Netzwerk, GUI, Disk (begrenzt), Threads (begrenzt), Klassenlader und Reflexion]. Die Sandbox ähnelt dem Browser-Applet. Wir verwenden Security, benutzerdefinierte Classloader per Roboter, etc ...
Es gibt zwei Möglichkeiten, wie Scala Laufzeit in Robocode Gastgeber:
1) laden sie zusammen mit Roboter in der Sandbox. Ziemlich sicher für uns, bevorzugte Lösung. Aber es wird Scala Laufzeitfähigkeiten beschädigen, weil Laufzeit Reflexion verwendet. Vielleicht generiert Klassen zur Laufzeit? Verwenden Sie Threads, um eine interne Bereinigung durchzuführen? Zugang zu JVM/Interna? (Ich möchte die Fähigkeiten der Sprache nicht einschränken)
2) benutze Scala Laufzeit als vertrauenswürdiger Code, außerhalb der Box, Sicherheit auf gleiche Ebene wie JDK. Sichtbarkeit für (bösartigen) Roboter. Sind die Scala Runtime APIs sicher? Haben Methoden sie Sicherheit Wachen? Gibt es einen abgesicherten Modus? Gibt es Singleton in Scala Laufzeit, , die missbraucht werden könnte, um zwischen Robotern zu kommunizieren? Irgendeine Konsistenz/Threadpool/Messaging, die Threads simulieren könnte? (Gibt es ein Sicherheits-Audit für Scala-Laufzeit?)
3) Etwas dazwischen, einige Klassen von Laufzeit in und einige aus. Welche Klassen/Pakete müssen für den Roboter sichtbar sein/welche sind nur private Implementierungen? (Dies scheint zukünftige Lösung zu sein)
Die Frage: Ist es möglich, aufzuzählen und zu isolieren, die Teile der Laufzeit, die in vertrauenswürdigen Umfang vom Rest laufen müssen? Spezifische Pakete und Klassen? Oder bessere Idee?
Ich bin auf der Suche nach einer bestimmten Antwort, die zu einer sicheren Lösung führt. Zufällige Gedanken willkommen, aber nicht vergeben. Es gibt eine laufende Diskussion unter scala email group. Noch keine konkrete Antwort.
Link zu Thread über Reflexion und Arrays: http://thread.gmane.org/gmane.comp.lang.scala.internals/2590 –
Mehrere gute Punkte hier. In Bezug auf bewegliches Ziel, richtig, ich bin glücklich, auf einzelne Version von scala abzuschließen. In Bezug auf "Aha! Ich werde Reflexion verwenden, um das zu lösen." das ist kriminelle Handlung. Ich möchte nicht, dass sich meine Benutzer/Neulinge in unserer Support-Gruppe über gebrochene Laufzeit beschweren, die wir nicht besitzen. Es ist mir nicht klar, ob die Laufzeit die Exception zumindest in etwas Konsistenz umwandeln/konvertieren wird. Ist es mindestens AccessController.doPrivileged() für solche Aktionen? –
Sie müssen die Markt Scala Ziele berücksichtigen. Reflektion ist in Java-Web-Frameworks und JVM-basierten dynamischen Sprachen ziemlich allgegenwärtig. Es ist eher gering im Vergleich zu Runtime Bytecode Manipulation, die auch üblich ist. Denken Sie auch daran, dass die Verwendung von Reflektion nicht unbedingt auf die Laufzeit oder die Bibliothek per se beschränkt ist, sondern dass der Compiler lediglich Aufrufe innerhalb des normalen Benutzercodes absetzt. Ich kann nicht eine einzige Instanz von AccessController in der Scala-Quelle finden, so dass ich denke, dass es überhaupt solche Dinge bewusst ist. –