2017-01-16 6 views
1

저는 크리스털을 처음 접했습니다 (루비는 사용하지 않았습니다). 그래서 무지를 사과드립니다! 나는 ecr docs을 보았지만 대답을 찾을 수없는 것 같습니다.템플릿에 임베디드 크리스탈 변수

Kemal의 동적 템플릿에 임베디드 크리스탈을 사용하고 있습니다. 확인해도됩니다 - 템플릿은 호출 범위에서 사용할 수있는 변수 만 렌더링하거나 템플릿 자체에서 메소드/함수 호출을 만들 수 있습니까? I.E. 템플릿 내에서 "악성"크리스탈 코드를 실행할 수있는 가능성이 있습니까? (이 경우 악성 코드는 I/O 또는 파일 액세스 등을 말합니다)?

는 케말의 문서에서 예제를 수행하려면 다음 뷰 hello.ecr에서

get "/:name" do |env| 
    name = env.params.url["name"] 
    render "src/views/hello.ecr" 
end 

이 - name 템플릿에서 사용할 수있는 유일한 항목, 또는 수 일 전화 File.delete("./foo") 예를 들어 템플릿 내에서?

답변

1

템플릿을 Crystal 코드로 컴파일하면 File.delete("./foo")과 같이 모든 종류의 코드를 쓸 수 있습니다. 예를 들어 템플릿에 <% File.delete("./foo") %>을 쓰면 코드를 작성할 수 있습니다.

name에 코드가 포함되어있어 어떻게 든 실행되고 걱정하지 않으셔도됩니다. Crystal에서 동적 런타임 코드를 실행할 수 없으므로 누군가가 템플릿에 악의적 인 코드를 삽입 할 방법이 없습니다.

+0

빠른 응답을 위해 @asterite에게 감사드립니다. 내 관심사 변수가 코드를 포함하는 것이 아니라, 내가 외부에서 제공 한 html 템플릿 (그 내용은 미리 알지 못할 수도 있음)을 파싱하는 솔루션을 찾고 있었고 실행 가능성을 피하기를 원했습니다. 가능한 경우 기본 변수 및 제어 구조를 넘어서는 코드 (if, else, 등). "A 간단한 해결책이하는 것입니다 : – corkington

+0

[이 조각은] (https://groups.google.com/forum/#!topic/crystal-lang/jX_dRFSdh78)는 꽤 오래된하지만, 내가 무엇을 찾고 있었다 사항 당신이 임의의 코드를 실행할 수없는 템플릿 시스템을 가지고 있다면 반복 실행을위한 일종의 작업을 수행 할 수 있습니다. 그런 다음 런타임에 그 템플릿을 해석 할 것입니다. 값이 포함 된 해시 또는 구조체 일 수 있습니다 ... " 이 경우 런타임 해석이 필요하지만이 경우에는 충분합니다. 어떤 아이디어? – corkington

+0

@corkington with ECR 임의의 코드의 런타임 실행이 Crystal에서는 불가능하기 때문에 임의의 코드를 실행할 수있는 방법은 전혀 없습니다. – asterite