Heim >Java >javaLernprogramm >Wie kann ich aus der Datenbank abgerufene Zeichenfolgen sicher in ausführbaren Java-Code kompilieren?

Wie kann ich aus der Datenbank abgerufene Zeichenfolgen sicher in ausführbaren Java-Code kompilieren?

Susan Sarandon
Susan SarandonOriginal
2024-12-02 04:02:09297Durchsuche

How Can I Safely Compile Database-Retrieved Strings into Executable Java Code?

String-Konvertierung in kompilierbaren Java-Code

Bei der Abfrage einer Datenbank werden häufig gespeicherte Ausdrücke bereitgestellt, die innerhalb bedingter Strukturen ausgewertet werden müssen. Die Möglichkeit, diese Zeichenfolgen in kompilierbaren Java-Code zu konvertieren, ermöglicht die dynamische Ausführung benutzerdefinierter Ausdrücke. In diesem Artikel wird die mögliche Lösung mithilfe der Compiler-API von Java untersucht, aber auch die potenziellen Risiken hervorgehoben, die mit dem Kompilieren von beliebigem Code verbunden sind.

Verwendung der Java Compiler-API

Für Java 6 und höher: Die Java Compiler API bietet eine Möglichkeit, Java-Code programmgesteuert zu kompilieren. Mit der Kernkomponente JavaCompiler können Sie Quellcode im Speicher definieren und so ein Comparator-Objekt dynamisch erstellen.

String comparatorClassName = ...; // Random name for comparison class
String expression = ...; // Retrieved database expression
String source = "public class " + comparatorClassName + " implements Comparable<" + comparableClassName + "> {" +
                "    public int compare(" + comparableClassName + " a, " + comparableClassName + " b) {" +
                "        return " + expression + ";" +
                "    }" +
                "}";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
Writer out = null; // Output writer
Iterable<? extends JavaFileObject> compilationUnits = new ArrayList<>();
compilationUnits.add(new SimpleJavaFileObject() { /* Details for loading source String */ });
compiler.getTask(out, null, null, null, null, compilationUnits).call();

Nach der Kompilierung können Sie den Comparator instanziieren und die Dynamik ausführen Ausdruck:

Comparator comparator = (Comparator) Class.forName(comparableClassName).newInstance();

Vorsichtsmaßnahmen

  • Das Kompilieren von beliebigem Java-Code birgt Sicherheitsrisiken. Kompilieren Sie nur vertrauenswürdigen Code.
  • Diese Lösung wurde aufgrund von Einschränkungen beim Compilerobjekt nicht gründlich getestet.

Das obige ist der detaillierte Inhalt vonWie kann ich aus der Datenbank abgerufene Zeichenfolgen sicher in ausführbaren Java-Code kompilieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn