2017-01-16 4 views
1

Ich bin neu in Crystal (und habe nie wirklich Ruby verwendet) also entschuldige mich für die Ignoranz hier! Ich habe mir die ecr docs angeschaut, finde aber dort keine Antwort.Eingebettete Kristallvariablen im Templating

Ich bin mit der Verwendung von Embedded Crystal für dynamische Vorlagen in Kemal. Kann ich bestätigen - können Vorlagen nur Variablen wiedergeben, die im Rahmen des Aufrufs verfügbar sind, oder kann man Methoden-/Funktionsaufrufe innerhalb der Vorlage selbst vornehmen? I.E. Gibt es irgendeine Möglichkeit/Risiko, "bösartigen" Kristallcode aus einer Vorlage heraus ausführen zu können (in diesem Fall bezieht sich böswillig auf E/A oder Dateizugriff usw.)?

Um ein Beispiel aus dem Kemal docs zu nehmen:

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

Nach Ansicht hello.ecr - ist name das einzige Element, das in der Vorlage zur Verfügung stehen wird, oder könnte einen Anruf File.delete("./foo") von in der Vorlage zum Beispiel?

Antwort

1

Eine Vorlage ist in Crystal Code kompiliert, Sie können jede Art von Code dort eingeben, wie File.delete("./foo"), zum Beispiel, wenn Sie <% File.delete("./foo") %> innerhalb Ihrer Vorlage schreiben.

Wenn Ihre Sorge ist, dass name wird Code enthalten und das wird irgendwie ausgeführt werden, dann mach dir keine Sorgen, das wird nicht passieren. Die Ausführung von dynamischem Laufzeitcode in Crystal ist nicht möglich. Daher wird niemand böswilligen Code in Ihre Vorlagen injizieren.

+0

Vielen Dank @asterite für Ihre schnelle Antwort. Meine Sorge ist nicht so sehr, dass die Variablen Code enthalten würden, sondern ich suchte nach einer Lösung, um extern bereitgestellte HTML-Templates zu parsen (deren Inhalt ich im Voraus nicht kennen werde) und möchte jede Möglichkeit der Ausführung von HTML vermeiden code jenseits von Basisvariablen und Kontrollstrukturen (wenn, sonst, außer etc.) wenn möglich. – corkington

+0

[Dieser Ausschnitt] (https://groups.google.com/forum/#!topic/crystal-lang/jX_dRFSdh78), obwohl ziemlich alt, Details was ich gesucht habe: "Eine einfachere Lösung wäre zu habe ein Template-System, wo man keinen beliebigen Code ausführen kann, sonst könnte man eine Art von for iterating haben und das wars. Zur Laufzeit würden Sie diese Vorlage interpretieren, denke ich. Sie würden ein Objekt an diese Vorlage übergeben Es kann ein Hash sein, der die Werte enthält. Oder vielleicht ein Struct ... " Ich schätze, dies würde Laufzeit Interpretation erfordern, aber das würde für diesen speziellen Fall ausreichen. Irgendwelche Ideen? – corkington

+0

@corkington mit ECR gibt es absolut keine Möglichkeit, beliebigen Code auszuführen, weil Laufzeitausführung von beliebigem Code in Crystal unmöglich ist – asterite