Maison >Java >javaDidacticiel >Comment puis-je compiler en toute sécurité des chaînes récupérées dans une base de données en code Java exécutable ?

Comment puis-je compiler en toute sécurité des chaînes récupérées dans une base de données en code Java exécutable ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-02 04:02:09299parcourir

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

Conversion de chaîne en code Java compilable

L'interrogation d'une base de données fournit souvent des expressions stockées qui nécessitent une évaluation dans des structures conditionnelles. La possibilité de convertir ces chaînes en code compilable Java permet l'exécution dynamique d'expressions personnalisées. Cet article explore la solution potentielle utilisant l'API du compilateur Java, mais met en évidence les risques potentiels liés à la compilation de code arbitraire.

Utilisation de l'API du compilateur Java

Pour Java 6 et supérieur, l'API Java Compiler offre un moyen de compiler du code Java par programme. Le composant principal, JavaCompiler, vous permet de définir le code source en mémoire, offrant la possibilité de créer dynamiquement un objet Comparator.

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();

Une fois compilé, vous pouvez instancier le Comparator et exécuter l'expression dynamique. :

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

Précautions

  • Compilation le code Java arbitraire présente des risques de sécurité. Compilez uniquement du code fiable.
  • Cette solution n'a pas été testée de manière approfondie en raison des limitations de l'objet compilateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn