Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
jstachio__jstachio_CVE-2023-33962_1-0-0 — 타입 안전한 Java Mustache 템플릿 엔진으로, 컴파일 타임 템플릿 검증, 정적 값 바인딩, 그리고 HTML 및 기타 콘텐츠 유형을 위한 확장 가능한 이스케이프 기능을 제공합니다. | Kitploit
도구/GitHubGitHub/shoucheng3/jstachio__jstachio_cve-2023-33962_1-0-0
General Purpose UtilitiesStatic Code Analysis (SAST)Code AnalysisWeb SecurityLearning & Education
GitHubshoucheng3/jstachio__jstachio_cve-2023-33962_1-0-0

jstachio__jstachio_CVE-2023-33962_1-0-0

타입 안전한 Java Mustache 템플릿 엔진으로, 컴파일 타임 템플릿 검증, 정적 값 바인딩, 그리고 HTML 및 기타 콘텐츠 유형을 위한 확장 가능한 이스케이프 기능을 제공합니다.

저장소 보기

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
311개월 전아직 검토되지 않음
공유

Maven Central Github

jstachio

타입 안전한 Java Mustache 템플릿 엔진입니다.

템플릿은 읽을 수 있는 Java 소스 코드로 컴파일되며 값 바인딩은 정적으로 검사됩니다.

문서

  • 최신 SNAPSHOT JStachio 문서
  • 현재 릴리스된 JStachio 문서

문서는 javadoc.io에도 있지만 위와 같이 집계되지는 않습니다. 집계된 javadoc이 선호되는 문서이며 이 readme의 나머지 부분은 주로 선전 마케팅 목적입니다.

이전 릴리스의 경우:

root@kitploit:~
https://jstach.io/doc/jstachio/VERSION/apidocs

여기서 VERSION은 원하는 버전입니다.

왜 JStachio를 선택해야 하나

why_jstachio_is_better.md에서 다룹니다.

기능

  • 로직리스 Mustache (v 1.3) 문법.

    • 선택 사항이 아닌 Mustache 사양 v1.3.0 요구 사항을 완전 지원 (공백 포함)
    • 약간의 제약 사항이 있는 선택적 상속 지원
    • 정적 특성으로 인해 약간의 차이가 있는 선택적 람다 지원
  • 오늘 JEP 430과 같은 지원을 제공하지만 훨씬 더 강력합니다.

  • 템플릿은 Java 코드로 컴파일됩니다

  • 값 바인딩은 정적으로 검사됩니다.

  • 메서드, 필드 및 getter 메서드는 템플릿에서 참조할 수 있습니다.

  • 컨텍스트가 포함된 친화적인 오류 메시지.

  • 구성이 필요 없습니다. 플러그인이나 조정이 필요하지 않습니다. 모든 작업은 표준 javac와 모든 IDE 및/또는 빌드 시스템으로 수행됩니다.

  • HTML이 아닌 템플릿도 지원됩니다. 지원되는 이스케이프 콘텐츠 유형 집합은 확장 가능합니다.

  • Mustache 상속 사양을 통한 레이아웃이 지원됩니다.

  • ServiceLoader를 통한 폴백 렌더 서비스 확장 지점

    • JMustache 및 mustache.java를 통한 리플렉션 기반 런타임 렌더링으로 매끄럽게 폴백 (개발 중 실시간 템플릿 변경에 유용)
    • 생성된 코드를 선호하지 않더라도 JStachio를 사용하여 mustache 템플릿을 타입 검사할 수 있습니다.
  • 출력할 수 있는 허용 유형을 사용자 지정할 수 있습니다. 그렇지 않으면 컴파일러 오류가 발생합니다 (친숙한 toString이 없는 클래스에서 toString이 호출되는 것을 방지).

  • 런타임에 변수의 사용자 지정 toString을 위한 포맷터

  • 트레이트 같은 추가 기능을 위해 생성된 코드에 추가 implements 인터페이스를 추가합니다 (@JStacheInterfaces)

  • 강력한 람다 지원

  • Map<String, ?> 지원

  • Optional<?> 지원

  • JMustache 및 목록 인덱스 확장(, , 등)과 호환

성능

이 프로젝트의 목표는 가장 빠른 Java 템플릿 엔진이 되는 것이 아닙니다!

(하지만 이 readme가 마지막으로 업데이트되었을 때 제가 아는 한 현재 가장 빠릅니다)

템플릿 언어에서 성능이 그렇게 중요하지는 않지만 (병목이 되는 경우는 드뭅니다) JStachio는 매우 빠릅니다:

https://github.com/agentgt/template-benchmark

문자열 출력

템플릿 비교

확장 문자를 포함한 UTF-8 바이트 출력

템플릿 비교

빠른 예제

root@kitploit:~

@JStache(template = """
        {{#people}}
        {{message}} {{name}}! You are {{#ageInfo}}{{age}}{{/ageInfo}} years old!
        {{#-last}}
        That is all for now!
        {{/-last}}
        {{/people}}
        """)
public record HelloWorld(String message, List<Person> people) implements AgeLambdaSupport {
}

public record Person(String name, LocalDate birthday) {
}

public record AgeInfo(long age, String date) {
}

public interface AgeLambdaSupport {

    @JStacheLambda
    default AgeInfo ageInfo(Person person) {
        long age = ChronoUnit.YEARS.between(person.birthday(), LocalDate.now());
        String date = person.birthday().format(DateTimeFormatter.ISO_DATE);
        return new AgeInfo(age, date);
    }

}

@Test
public void testPerson() throws Exception {
    Person rick = new Person("Rick", LocalDate.now().minusYears(70));
    Person morty = new Person("Morty", LocalDate.now().minusYears(14));
    Person beth = new Person("Beth", LocalDate.now().minusYears(35));
    Person jerry = new Person("Jerry", LocalDate.now().minusYears(35));
    String actual = JStachio.render(new HelloWorld("Hello alien", List.of(rick, morty, beth, jerry)));
    String expected = """
            Hello alien Rick! You are 70 years old!
            Hello alien Morty! You are 14 years old!
            Hello alien Beth! You are 35 years old!
            Hello alien Jerry! You are 35 years old!
            That is all for now!
                            """;
    assertEquals(expected, actual);

}

설치

Maven

root@kitploit:~
<properties>
    <io.jstach.version>0.6.0-SNAPSHOT</io.jstach.version>
</properties>
...
<dependencies>
    <dependency>
        <groupId>io.jstach</groupId>
        <artifactId>jstachio</artifactId>
        <version>${io.jstach.version}</version>
    </dependency>
</dependencies>
...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>17</source> <!-- 17 is the minimum -->
                <target>17</target> <!-- 17 is the minimum -->
                <annotationProcessorPaths>
                    <path>
                        <groupId>io.jstach</groupId>
                        <artifactId>jstachio-apt</artifactId>
                        <version>${io.jstach.version}</version>
                    </path>
                    <!-- other annotation processors -->
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

참고: 어노테이션 jar(jstachio-annotation)는 전이적으로 포함됩니다

Gradle

root@kitploit:~
dependencies {
 
    implementation 'io.jstach:jstachio:VERSION'
 
    annotationProcessor 'io.jstach:jstachio-apt:VERSION'
}

예제

user.mustache

root@kitploit:~
{{#name}}
<p>Name: {{.}}, Name Length is {{length}}</p>
{{/name}}

<p>Age: {{  age  }}</p>

<p>Achievements:</p>

<ul>
{{#array}}
  <li>{{.}}</li>
{{/array}}
</ul>

{{^array}}
<p>No achievements</p>
{{/array}}

<p>Items:</p>

<ol>
{{#list1}}
  <li>{{value}}</li>
{{/list1}}
</ol>

User.java

다음 클래스는 위 템플릿을 채울 실제 데이터를 제공하는 데 사용할 수 있습니다.

root@kitploit:~
@JStache(
    // points to src/main/resources/user.mustache file
    path = "user.mustache",
   
    // or alternatively you can inline the template
    template = "", 

    )
public record User(String name, int age, String[] array, List<Item<String>> list) {

   public static class Item<T> {
        private final T value;
        public Item(T value) {
            this.value = value;
        }
        T value() {
            return value;
        }
    }
}

렌더링

위 코드로 새 클래스 UserRenderer가 기계적으로 생성됩니다. 이 클래스는 실제 데이터로 채워진 템플릿을 렌더링하는 데 사용할 수 있습니다. 템플릿을 렌더링하려면 다음 코드를 사용할 수 있습니다:

root@kitploit:~
class Main {
    public static void main(String[] args) throws IOException {
        User user = new User("John Doe", 21, new String[] {"Knowns nothing"}, list);
        StringBuilder appendable = new StringBuilder();
        JStachio.render(user, appendable);
    }
}

이 코드를 실행한 결과는 다음과 같습니다.

root@kitploit:~
<p>Name: John Doe, Name Length is 8</p>

<p>Age: 21</p>

<p>Achievements:</p>

<ul>
  <li>Knowns nothing</li>
</ul>

<p>Items:</p>

<ol>
  <li>helmet</li>
  <li>shower</li>
</ol>

존재하지 않는 필드나 렌더링할 수 없는 유형의 필드를 참조하면 모두 컴파일 타임 오류가 발생합니다. 이러한 오류는 Java 소스의 다른 가능한 오류와 함께 프로젝트의 컴파일 타임에 보고됩니다.

root@kitploit:~
target/classes/user.mustache:5: error: Field not found in current context: 'age1'
  <p>Age: {{  age1  }} ({{birthdate}}) </p>
                  ^
  symbol: mustache directive
  location: mustache template
root@kitploit:~
target/classes/user.mustache:5: error: Unable to render field: type error: Can't render data.birthdate expression of java.util.Date type
  <p>Age: {{  age  }} ({{birthdate}}) </p>
                                    ^
  symbol: mustache directive
  location: mustache template

더 많은 예제는 test/examples 프로젝트를 참조하세요.

Java 특정 확장

Enum 매칭 지원

기본적으로 enum에는 조건부 섹션으로 사용할 수 있는 enum 이름(Enum.name())인 boolean 키가 있습니다.

light가 다음과 같은 enum이라고 가정합니다:

root@kitploit:~
public enum Light {
  RED,
  GREEN,
  YELLOW
}

패턴 매치처럼 enum을 조건부로 선택할 수 있습니다:

root@kitploit:~
{{#light.RED}}
STOP
{{/light.RED}}
{{#light.GREEN}}
GO
{{/light.GREEN}}
{{#light.YELLOW}}
Proceeed with caution
{{/light.YELLOW}}

인덱스 지원

JStachio는 반복 가능한 섹션에서 handlebars와 JMustache 인덱스 키를 모두 지원합니다.

  • -first는 첫 번째 항목에 있을 때 true인 boolean입니다.
  • -last는 iterable의 마지막 항목에 있을 때 true인 boolean입니다.
  • -index는 1부터 시작하는 인덱스입니다. 첫 번째 항목은 0이 아니라 1입니다.

람다 지원

JStachio는 JMustache와 유사한 방식으로 람다 섹션 호출을 지원합니다. 메서드에 @JStacheLambda를 태그하면 반환된 모델이 람다 섹션의 내용을 렌더링하는 데 사용됩니다. 컨텍스트 스택의 최상위를 람다에 전달할 수 있습니다.

JStachio는 사양과 달리 컨텍스트 스택에 대해 렌더링된 다음 동적 템플릿을 반환하는 것을 지원하지 않습니다. 그러나 호출자가 람다 섹션의 내용을 변경하여 동적 출력을 얻을 수 있습니다. 섹션의 내용이 인라인 템플릿 역할을 하기 때문입니다.

설계

아이디어는 mustache의 로직리스 철학과 Java의 단일 책임 및 정적 타이핑을 결합한 템플릿 엔진을 만드는 것입니다. 구문과 데이터 바인딩의 완전한 컴파일 타임 검사가 주요 요구 사항입니다.

현재 템플릿에 대해 Java 코드가 생성됩니다. 생성된 Java 코드는 컴파일에 실패해서는 안 됩니다. 일부 템플릿에서 유효한 Java 코드를 생성할 수 없는 경우 템플릿 파일을 가리키는 친화적인 컴파일 타임 오류가 생성되어야 합니다. 사용자는 생성된 Java 코드에 노출되어서는 안 됩니다.

원래 mustache는 Javascript 객체를 사용하여 렌더링 컨텍스트를 정의합니다. 선택된 Javascript 객체의 필드는 템플릿 필드에 바인딩됩니다.

Static mustache는 Java 객체를 사용하여 렌더링 컨텍스트를 정의합니다. 템플릿 필드의 바인딩은 컴파일 타임에 정의되고 검사됩니다. 누락된 필드는 컴파일 타임 오류입니다.

라이선스

JStachio는 BSD 3-clause 라이선스를 따릅니다.

도구 다운로드
Handlebars
-first
-last
-index
  • 지금까지 가장 빠른 Java Mustache 유사 템플릿 엔진이자 일반적으로 가장 빠른 엔진 중 하나입니다.

  • JStachio 자체 외에 의존성이 전혀 없음

  • 완전한 제로 런타임 의존성 옵션을 사용할 수 있습니다 (필요한 모든 코드가 생성되므로 런타임 중에는 jstachio조차 필요하지 않습니다). 어노테이션 프로세서 및 기타 제로 의존성 프로젝트에서 Maven shade를 사용할 필요가 없습니다. 또한 Graal VM 네이티브 프로젝트에서 가능한 한 최소한의 설치 공간을 위해 유용합니다.

  • Spring Framework에 대한 일급 지원 (보조 프로젝트가 아닌 프로젝트 자체에서 플러그인을 제공한다는 의미)