ホームページ >Java >&#&チュートリアル >データベースから取得した文字列を実行可能な Java コードに安全にコンパイルするにはどうすればよいですか?

データベースから取得した文字列を実行可能な Java コードに安全にコンパイルするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-02 04:02:09299ブラウズ

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

コンパイル可能な Java コードへの文字列変換

データベースのクエリでは、多くの場合、条件構造内での評価を必要とする格納された式が提供されます。これらの文字列を Java コンパイル可能なコードに変換する機能により、カスタム式を動的に実行できます。この記事では、Java のコンパイラ API を使用した潜在的な解決策を検討しますが、任意のコードのコンパイルに伴う潜在的なリスクを強調します。

Java コンパイラ API の使用

Java 6 以降の場合、 Java コンパイラ API は、Java コードをプログラム的にコンパイルする手段を提供します。コア コンポーネントである JavaCompiler を使用すると、メモリ内でソース コードを定義し、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();

コンパイルが完了すると、Comparator をインスタンス化し、動的オブジェクトを実行できます。式:

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

注意事項

  • 任意の Java コードをコンパイルすると、セキュリティ上のリスクが生じます。信頼できるコードのみをコンパイルしてください。
  • コンパイラ オブジェクトの制限のため、このソリューションは完全にはテストされていません。

以上がデータベースから取得した文字列を実行可能な Java コードに安全にコンパイルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。