>Java >java지도 시간 >데이터베이스에서 검색한 문자열을 실행 가능한 Java 코드로 안전하게 컴파일하려면 어떻게 해야 합니까?

데이터베이스에서 검색한 문자열을 실행 가능한 Java 코드로 안전하게 컴파일하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-02 04:02:09297검색

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

컴파일 가능한 Java 코드로 문자열 변환

데이터베이스를 쿼리하면 조건부 구조 내에서 평가가 필요한 저장된 표현식이 제공되는 경우가 많습니다. 이러한 문자열을 Java 컴파일 가능 코드로 변환하는 기능을 통해 사용자 정의 표현식을 동적으로 실행할 수 있습니다. 이 기사에서는 Java의 컴파일러 API를 사용하여 잠재적인 솔루션을 탐색하지만 임의 코드 컴파일과 관련된 잠재적인 위험을 강조합니다.

Java Compiler 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.