2017-01-16 4 views
1

私はクリスタルを初めて使っています(実際にはルビーを使ったことはありません)。私はecr docsを見ましたが、そこに答えが見つからないようです。テンプレートに埋め込まれたクリスタル変数

Kemalの動的テンプレートに埋め込みCrystalを使用しています。確認できますか?テンプレートは呼び出しのスコープで使用可能な変数のみをレンダリングすることができますか、テンプレート自体からメソッド/関数呼び出しを行うことはできますか? I.テンプレート内から "悪意のある"クリスタルコードを実行する可能性/危険性があります(この場合悪意のあるものはI/Oやファイルへのアクセスなどを指します)。ケマルのドキュメントから例を取るために

:ビューhello.ecr

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

は - nameテンプレートで利用できるようになります唯一の項目である、または1つは、例えば、テンプレート内からFile.delete("./foo")を呼ぶだろうか?

答えて

1

テンプレートがCrystalコードにコンパイルされている場合は、テンプレート内に<% File.delete("./foo") %>と書くと、File.delete("./foo")のように任意の種類のコードを書くことができます。

nameにコードが含まれていて、何とか実行されてしまうことが心配ならば、それは起こりそうにないと心配しないでください。 Crystalでの動的ランタイムコードの実行は不可能なので、誰かがあなたのテンプレートに悪質なコードを挿入する方法はありません。

+0

あなたの迅速な対応のために@asteriteに感謝します。変数にコードが含まれているというだけのことではなく、外部から提供されているHTMLテンプレート(その内容は事前にわかっているかもしれませんが)を解析するソリューションを探していて、実行の可能性を避けたいと考えています可能であれば、基本変数および制御構造を超えたコード(if、else、など)。 – corkington

+0

[このスニペット](https://groups.google.com/forum/#!topic/crystal-lang/jX_dRFSdh78)はかなり古いものですが、私が探していたものの詳細: 「もっと簡単な解決策はあなたが任意のコードを実行することができないテンプレートシステムを持っているあなたは反復処理のためのものであればそれを持っている可能性があります実行時にそのテンプレートを解釈するでしょう。値を含むハッシュや、おそらく構造体になる可能性があります... " これは実行時の解釈が必要なことを認めていますが、この場合はこれで十分です。何か案は? – corkington

+0

@corkington with ECR Crystalでは任意のコードの実行時実行が不可能なので、任意のコードを実行する方法は全くありません – asterite

関連する問題