5

Razor 構文と (カスタム) ヘルパーを人々に公開する方法はありますか? しかし、... コード ブロックの作成を許可しない、またはヘルパーの使用のみを制限し、純粋に実行する権限を与えないようにする方法はありますか?ビュー内の C# コード ?

同様のソリューションへのアイデアやポインタは大歓迎です!

更新: // ユーザーが独自の HTML を記述し、html ヘルパーのリストにのみアクセスできるようにしたいと考えています。ほとんどがデフォルトのものと私が作成したものです。

たとえば、私は彼らが@{ //code }ブロック内でコードを実行できるようにしたくusingありませ@modelん。@Html.* @if else for foreach

またはさらに良いことに、特定の名前空間へのアクセスのみを許可します(これは単なる考えです)

update:// いくつかのテストの後、RazorEngine が私がやろうとしていることに近いことがわかりました: 隔離された環境でビューを実行し、特定の名前空間へのアクセスを追加します。

4

4 に答える 4

4

私はあなたがそうすることをお勧めしません。サイトのセキュリティを損なうことなく、この機能を提供する簡単で信頼できる方法はありません。あなたがあなたのユーザーを信頼するなら、あなたはそれをすることができます。そうでない場合は、このようなテンプレートエンジンがDotLiquidこの目的にはるかに適しています。

于 2013-02-26T12:57:59.417 に答える
2

Microsoft の Razor に基づいて構築されたRazorEngineというプロジェクトがあり、MVC ビューを返すコンテキストにいなくてもその構文を解析できます。使用方法は次のとおりです。

 string template = "Hello @Model.Name! Welcome to Razor!";
 string result = Razor.Parse(template, new { Name = "World" });

カスタマイズされたテンプレート ベースを指定することもできます。これにより、ユーザーに公開する Html ヘルパーのみを定義できるようになります。

 Razor.SetTemplateBase(typeof(HtmlTemplateBase<>));

 string template = 
  @"<html>
      <head>
        <title>Hello @Model.Name</title>
      </head>
      <body>
        Email: @Html.TextBoxFor(m => m.Email)
      </body>
    </html>";

  var model = new PageModel { Name = "World", Email = "someone@somewhere.com" };
  string result = Razor.Parse(template, model);
于 2013-02-28T03:25:33.240 に答える
2

Razor ビュー エンジンと関連するクラスを変更して、許可されていない状況を確認してみてください。

ソースが生成されると (ビュー エンジンがコンパイルするソース ファイルを生成します)、手動で (c# または vb.net コードを解析して) チェックする必要があります。可能ですが、現実的ではありません(本当に)。

コードを解析してチェックできたとしても、自分のコード (許可されている) と顧客コード (制限がある) を特定する必要があります。

最後に、別のテンプレート エンジンを使用すること以外は本当に禁止できないという事実を受け入れる必要があります。

なぜなら

  1. 顧客は、ビューをあなたのビューに似せる方法を見つけるでしょう。
  2. 次のようなほとんどの基本的な必須機能を制限することはできませんvar r = new Random();
  3. 最も基本的な要件が何であるかを見積もることはできません
  4. 顧客がカスタム ライブラリを使用する必要がある場合、顧客に No とは言えません。

ちなみに、別のことを試すこともできます。仮想パス プロバイダーを作成AviatrixTemplateし、実行時に要求されたときに書き込まれた顧客テンプレートを変換します。このルートを使用すると、引き続き剃刀エンジンを使用できますが、変換時にわずかな時間しか失われません (1 回のみです)。ただし、AviatrixTemplateハイライト表示されないため、許可されていないコードを確認する必要があります。

PS: 基本的なループは、ユーザーに必要以上のものを与える可能性があります。たとえば、次のコードでは、クラスを作成して一度呼び出すことができます。完全修飾クラス名を使用するか、Activator.CreateInstance.

@for (var r = new Random(); r != null; r = null)
{
    @r.NextDouble()
}

気にしないでください。

于 2013-02-27T23:33:36.393 に答える
0

私はこれまでやったことはありませんが、ユーザーにコードを書き、それをコンパイルして使用できるようにしたいと考えているようですね。

その場合は、CSharpCodeProviderクラス、RazorTemplateEngineクラス、およびSystem.CodeCom.Compiler名前空間を調べてください。

これらのクラスに関する情報については、こちらをご覧ください。

CSharpCodeProvider: http://support.microsoft.com/kb/304655

RazorTemplateEngine: http://msdn.microsoft.com/en-us/library/system.web.razor.razortemplateengine(v=vs.111).aspx

于 2013-02-26T13:03:44.630 に答える